{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "import pickle\n",
    "import torch\n",
    "from torch import nn\n",
    "import numpy as np\n",
    "from torch.utils.data import DataLoader, Dataset\n",
    "import random\n",
    "import os\n",
    "from sklearn.manifold import TSNE\n",
    "from sklearn.decomposition import PCA\n",
    "from matplotlib import pyplot as plt\n",
    "from environment import get_carenvvec\n",
    "from common import min_gps, max_gps, real_distance, block_number, cuda\n",
    "blocks = block_number[0] * block_number[1]\n",
    "delta_gps = max_gps - min_gps"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "consts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "CANCELPROB_BATCH_SIZE = 4096\n",
    "CANCELPROB_TESTSIZE = 0.05\n",
    "CANCELPROB_EPOCH = 10\n",
    "CANCELPROB_MIN_EPOCH = 10\n",
    "CANCELPROB_LR = 0.01\n",
    "CANCELPROB_EVAL_ITERATION = 1000\n",
    "CANCELPROB_MODEL = 'cancelProb/best.pt'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "GRID_BATCH_SIZE = 256\n",
    "GRID_TESTSIZE = 0.1\n",
    "GRID_EPOCH = 100\n",
    "GRID_MIN_EPOCH = 100\n",
    "GRID_LR = 0.001\n",
    "GRID_EVAL_ITERATION = 1000\n",
    "GRID_MODEL = 'grid/best.pt'"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "data read & process"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "dict_keys(['hour', 'pos', 'ETA', 'prob', 'reward']) dict_keys(['order', 'reward']) dict_keys(['center', 'ID', 'vertex'])\n"
     ]
    }
   ],
   "source": [
    "pkl_folder = 'data/pkl/'\n",
    "model_folder = 'data/model/'\n",
    "\n",
    "cancel_prob_all_data = pickle.load(open(pkl_folder + 'cancel_prob_train.pkl', 'rb'))\n",
    "grid_order_reward_all_data = pickle.load(open(pkl_folder + 'grid_order_reward.pkl', 'rb'))\n",
    "hex_grid_data = pickle.load(open(pkl_folder + 'hex_grid.pkl', 'rb'))\n",
    "print(cancel_prob_all_data.keys(), grid_order_reward_all_data.keys(), hex_grid_data.keys())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'ETA': [1327.0779045105526, 847.6405218280669], 'reward': [4.182467829036552, 2.826104770240745]} {'order': [1.3818544802263453, 2.0466071372530115], 'reward': [0.003739948797879627, 0.000964668315987685]} [array([103.99934794,  30.64954967]), array([0.53464349, 0.32957612])]\n"
     ]
    }
   ],
   "source": [
    "def make_standard_normal(indict, keys):\n",
    "    stdmean = {}\n",
    "    for i in keys:\n",
    "        j = [indict[i].mean(), indict[i].std()]\n",
    "        indict[i] = (indict[i].astype('float') - j[0]) / j[1]\n",
    "        stdmean[i] = j\n",
    "    return stdmean\n",
    "cancel_prob_stdmean = make_standard_normal(cancel_prob_all_data, ['ETA', 'reward'])\n",
    "\n",
    "#grid\n",
    "grid_order_reward_all_data['order'] = np.log(grid_order_reward_all_data['order'] + 1)\n",
    "grid_reward = grid_order_reward_all_data['reward']\n",
    "grid_order_reward_all_data['reward'] = grid_reward[grid_reward != 0]\n",
    "grid_stdmean = make_standard_normal(grid_order_reward_all_data, ['reward', 'order'])\n",
    "grid_reward[grid_reward != 0] = grid_order_reward_all_data['reward']\n",
    "grid_order_reward_all_data['reward'] = grid_reward\n",
    "\n",
    "#hex grid\n",
    "hex_grid_stdmean = [hex_grid_data['center'].mean(axis=0), hex_grid_data['center'].std(axis=0)]\n",
    "hex_grid_data['center'] = (hex_grid_data['center'] - hex_grid_stdmean[0]) / hex_grid_stdmean[1]\n",
    "cancel_prob_all_data['pos'] = (cancel_prob_all_data['pos'] - min_gps) / delta_gps - 0.5\n",
    "print(cancel_prob_stdmean, grid_stdmean, hex_grid_stdmean)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "def datasplit(data_dict, test_line):\n",
    "    k = list(data_dict.keys())\n",
    "    print(k)\n",
    "    alldata = []\n",
    "    for i in k:\n",
    "        alldata.append(data_dict[i])\n",
    "    alldata = list(zip(*alldata))\n",
    "    print(len(alldata))\n",
    "    line = int((1 - test_line) * len(alldata))\n",
    "    random.shuffle(alldata)\n",
    "    traindata = list(zip(*alldata[:line]))\n",
    "    testdata = list(zip(*alldata[line:]))\n",
    "    trainres = {}\n",
    "    testres = {}\n",
    "    for i in range(len(k)):\n",
    "        trainres[k[i]] = traindata[i]\n",
    "        testres[k[i]] = testdata[i]\n",
    "    return trainres, testres"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(2500, 24)\n"
     ]
    }
   ],
   "source": [
    "#for i in grid_order_reward_all_data.keys():\n",
    "#    grid_order_reward_all_data[i] = grid_order_reward_all_data[i][:-1,:,:]\n",
    "print(grid_order_reward_all_data['reward'].shape)\n",
    "shape = grid_order_reward_all_data['reward'].shape\n",
    "temparr = np.zeros(shape, dtype='int')\n",
    "temparr[:] = np.arange(shape[1])\n",
    "grid_order_reward_all_data['hour'] = temparr\n",
    "temparr = np.zeros(shape, dtype='int')\n",
    "temparr = np.transpose(temparr, (1, 0))\n",
    "temparr[:] = np.arange(shape[0])\n",
    "temparr = np.transpose(temparr, (1, 0))\n",
    "grid_order_reward_all_data['pos'] = temparr\n",
    "\n",
    "# TODO: remove 0-3h\n",
    "# TODO: remove zeros\n",
    "\n",
    "for k in grid_order_reward_all_data.keys():\n",
    "    grid_order_reward_all_data[k] = grid_order_reward_all_data[k].reshape(-1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['hour', 'prob', 'ETA', 'reward', 'pos']\n",
      "6104884\n",
      "1416\n",
      "75\n"
     ]
    }
   ],
   "source": [
    "class CancelProbDataset(Dataset):\n",
    "    def __init__(self, cancel_prob_dict):\n",
    "        super(CancelProbDataset, self).__init__()\n",
    "        for key in cancel_prob_dict.keys():\n",
    "            exec('self.' + key + \" = cancel_prob_dict['\" + key + \"']\")\n",
    "    def __len__(self):\n",
    "        return len(self.pos)\n",
    "    def __getitem__(self, x):\n",
    "        # startPos, endPos, hour, reward, ETA, prob\n",
    "        return (*self.pos[x], self.hour[x], self.reward[x], self.ETA[x], self.prob[x])\n",
    "\n",
    "cancel_prob_train_data, cancel_prob_test_data = datasplit(cancel_prob_all_data, CANCELPROB_TESTSIZE)\n",
    "    \n",
    "cancelProbTrainDataset = CancelProbDataset(cancel_prob_train_data)\n",
    "cancelProbTrainDataLoader = DataLoader(cancelProbTrainDataset, CANCELPROB_BATCH_SIZE, True)\n",
    "print(len(cancelProbTrainDataLoader))\n",
    "cancelProbTestDataset = CancelProbDataset(cancel_prob_test_data)\n",
    "cancelProbTestDataLoader = DataLoader(cancelProbTestDataset, CANCELPROB_BATCH_SIZE, True)\n",
    "print(len(cancelProbTestDataLoader))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['order', 'hour', 'reward', 'pos']\n",
      "60000\n",
      "211\n",
      "24\n"
     ]
    }
   ],
   "source": [
    "class GridDataset(Dataset):\n",
    "    def __init__(self, grid_dict, center):\n",
    "        super(GridDataset, self).__init__()\n",
    "        for key in grid_dict.keys():\n",
    "            exec('self.' + key + \" = grid_dict['\" + key + \"']\")\n",
    "        self.center = center\n",
    "    def __len__(self):\n",
    "        return len(self.reward)\n",
    "    def __getitem__(self, x):\n",
    "        posx = self.pos[x] / block_number[1] + 0.5\n",
    "        posy = self.pos[x] % block_number[1] + 0.5\n",
    "        pos = [posx, posy] / block_number - 0.5\n",
    "        return (pos, self.hour[x], self.order[x], self.reward[x])\n",
    "grid_order_reward_train_data, grid_order_reward_test_data = datasplit(grid_order_reward_all_data, GRID_TESTSIZE)\n",
    "    \n",
    "gridTrainDataset = GridDataset(grid_order_reward_train_data, hex_grid_data['center'])\n",
    "gridTrainDataLoader = DataLoader(gridTrainDataset, GRID_BATCH_SIZE, True)\n",
    "print(len(gridTrainDataLoader))\n",
    "gridTestDataset = GridDataset(grid_order_reward_test_data, hex_grid_data['center'])\n",
    "gridTestDataLoader = DataLoader(gridTestDataset, GRID_BATCH_SIZE, True)\n",
    "print(len(gridTestDataLoader))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "class CancelProbModel(nn.Module):\n",
    "    def __init__(self, hourfeat = 8):\n",
    "        super(CancelProbModel, self).__init__()\n",
    "        self.houremb = nn.Embedding(24, hourfeat)\n",
    "        \n",
    "        self.fc = nn.Sequential(\n",
    "            nn.Linear(hourfeat + 6, 32),\n",
    "            nn.ReLU(),\n",
    "            nn.Linear(32, 10)\n",
    "        )\n",
    "    # startPos, endPos, hour, reward, ETA, prob\n",
    "    def forward(self, startPos, endPos, hour, reward, ETA):\n",
    "        startPos = startPos.float()\n",
    "        endPos = endPos.float()\n",
    "        hour = self.houremb(hour)\n",
    "        reward = reward.unsqueeze(1)\n",
    "        ETA = ETA.unsqueeze(1)\n",
    "        #print(startGID.shape, endGID.shape, hour.shape, week.shape)\n",
    "        x = torch.cat((startPos, endPos, hour, reward, ETA), dim = 1)\n",
    "        #print(x.shape)\n",
    "        x = self.fc(x)\n",
    "        #print(x.shape)\n",
    "        return x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "class GridModel(nn.Module):\n",
    "    def __init__(self, hourfeat = 8):\n",
    "        super(GridModel, self).__init__()\n",
    "        self.houremb = nn.Embedding(24, hourfeat)\n",
    "        \n",
    "        self.order = nn.Sequential(\n",
    "            nn.Linear(hourfeat + 2, 32),\n",
    "            nn.ReLU(),\n",
    "            nn.Linear(32, 1)\n",
    "        )\n",
    "        self.reward = nn.Sequential(\n",
    "            nn.Linear(hourfeat + 2, 32),\n",
    "            nn.ReLU(),\n",
    "            nn.Linear(32, 1)\n",
    "        )\n",
    "    def forward(self, GPS, hour):\n",
    "        GPS = GPS.float()\n",
    "        hour = self.houremb(hour)\n",
    "        #print(GID.shape, hour.shape, week.shape)\n",
    "        x = torch.cat((GPS, hour), dim = 1)\n",
    "        #print(x.shape)\n",
    "        return self.order(x).squeeze(), self.reward(x).squeeze()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "def drawTSNE(datain, label, model):\n",
    "    data = model(torch.tensor(datain).cuda()).detach().cpu().numpy()\n",
    "    #tsne = TSNE(n_components=data.shape[1], learning_rate=100)\n",
    "    #data = np.array([[1,1,1],[1,1,1],[0,0,0],[0,0,0],[0,0,0],[1,1,1],[0,0,0]])\n",
    "    print(data[:100])\n",
    "    tsne = TSNE(method ='barnes_hut')\n",
    "    tsne = PCA()\n",
    "    data = tsne.fit_transform(data)\n",
    "    plt.scatter(data[:,0], data[:,1], 10, label)\n",
    "    plt.colorbar()\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch: 2, iteration: 3000, train loss: 0.011650, eval loss: 0.010298\n",
      "epoch: 2, iteration: 4000, train loss: 0.011212, eval loss: 0.010205\n",
      "epoch: 3, iteration: 5000, train loss: 0.010477, eval loss: 0.010126\n",
      "epoch: 4, iteration: 6000, train loss: 0.008616, eval loss: 0.009993\n",
      "epoch: 4, iteration: 7000, train loss: 0.009837, eval loss: 0.009940\n",
      "epoch: 5, iteration: 8000, train loss: 0.009529, eval loss: 0.009925\n",
      "epoch: 6, iteration: 9000, train loss: 0.011414, eval loss: 0.009875\n",
      "epoch: 6, iteration: 10000, train loss: 0.008639, eval loss: 0.009845\n",
      "epoch: 7, iteration: 11000, train loss: 0.010770, eval loss: 0.009824\n",
      "epoch: 8, iteration: 12000, train loss: 0.010218, eval loss: 0.009783\n",
      "epoch: 9, iteration: 13000, train loss: 0.009549, eval loss: 0.009846\n",
      "epoch: 9, iteration: 14000, train loss: 0.010622, eval loss: 0.009788\n",
      "epoch: 10, iteration: 15000, train loss: 0.009749, eval loss: 0.009762\n",
      "epoch: 11, iteration: 16000, train loss: 0.010086, eval loss: 0.009800\n",
      "epoch: 11, iteration: 17000, train loss: 0.009530, eval loss: 0.009774\n"
     ]
    }
   ],
   "source": [
    "cancelProbModel = cuda(CancelProbModel())\n",
    "cancelProbOpt = torch.optim.Adam(cancelProbModel.parameters(), CANCELPROB_LR)\n",
    "cancelProbLoss = nn.MSELoss()\n",
    "best_result = {\n",
    "    'model': None,\n",
    "    'opt': None,\n",
    "    'loss': 1e100,\n",
    "    'epoch': 0,\n",
    "    'iteration': 0\n",
    "}\n",
    "if CANCELPROB_MODEL != '':\n",
    "    if os.path.exists(model_folder + CANCELPROB_MODEL):\n",
    "        best_result = torch.load(model_folder + CANCELPROB_MODEL)\n",
    "        cancelProbModel.load_state_dict(best_result['model'])\n",
    "        cancelProbOpt.load_state_dict(best_result['opt'])\n",
    "    else:\n",
    "        print('model file not find:', model_folder + CANCELPROB_MODEL)\n",
    "iteration = best_result['iteration']\n",
    "end_epoch = CANCELPROB_EPOCH\n",
    "if best_result['epoch'] + CANCELPROB_MIN_EPOCH > end_epoch:\n",
    "    end_epoch = best_result['epoch'] + CANCELPROB_MIN_EPOCH\n",
    "for epoch in range(best_result['epoch'], end_epoch):\n",
    "    for num, data in enumerate(cancelProbTrainDataLoader):\n",
    "        data = list(map(cuda, data))\n",
    "        cancelProbModel.train()\n",
    "        cancelProbOpt.zero_grad()\n",
    "        output = data[-1].float()\n",
    "        #output[:] = (data[3] > 2).float().unsqueeze(1)\n",
    "        data = data[:-1]\n",
    "        res = cancelProbModel(*data)\n",
    "        #if output.sum() > 0: print(res, output)\n",
    "        l = cancelProbLoss(res, output)\n",
    "        l.backward()\n",
    "        cancelProbOpt.step()\n",
    "        if iteration % CANCELPROB_EVAL_ITERATION == 0:\n",
    "            # test\n",
    "            test_res = []\n",
    "            for data in cancelProbTestDataLoader:\n",
    "                data = list(map(cuda, data))\n",
    "                cancelProbModel.eval()\n",
    "                output = data[-1].float()\n",
    "                data = data[:-1]\n",
    "                res = cancelProbModel(*data)\n",
    "                l = cancelProbLoss(res, output)\n",
    "                test_res.append(l)\n",
    "            test_res = torch.tensor(test_res)\n",
    "            test_res = test_res.mean().item()\n",
    "            print('epoch: %d, iteration: %d, train loss: %f, eval loss: %f' % (epoch, iteration, l, test_res))\n",
    "            torch.save(best_result, model_folder + 'cancelProb/%04d.pt' % epoch)\n",
    "            with open(model_folder + 'cancelProb/log.txt', 'a') as f:\n",
    "                isbest = '\\tbest' if test_res < best_result['loss'] else ''\n",
    "                f.write('%04d %08d %f%s\\n' % (epoch, iteration, test_res, isbest))\n",
    "            if test_res < best_result['loss']:\n",
    "                best_result = {\n",
    "                    'model': cancelProbModel.state_dict(),\n",
    "                    'opt': cancelProbOpt.state_dict(),\n",
    "                    'loss': test_res,\n",
    "                    'epoch': epoch,\n",
    "                    'iteration': iteration\n",
    "                }\n",
    "                torch.save(best_result, model_folder + 'cancelProb/best.pt')\n",
    "        iteration += 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch: 154, iteration: 33000, loss: 0.237230 0.052777, eval loss: 0.196284 0.069579\n",
      "epoch: 158, iteration: 34000, loss: 0.219861 0.052195, eval loss: 0.198533 0.074989\n",
      "epoch: 163, iteration: 35000, loss: 0.185880 0.048030, eval loss: 0.201433 0.073826\n",
      "epoch: 168, iteration: 36000, loss: 0.285468 0.046721, eval loss: 0.216962 0.075192\n",
      "epoch: 172, iteration: 37000, loss: 0.198428 0.098834, eval loss: 0.201587 0.078768\n",
      "epoch: 177, iteration: 38000, loss: 0.177941 0.060055, eval loss: 0.201909 0.073174\n",
      "epoch: 182, iteration: 39000, loss: 0.199790 0.051764, eval loss: 0.204982 0.076440\n",
      "epoch: 187, iteration: 40000, loss: 0.212650 0.055019, eval loss: 0.202161 0.073627\n",
      "epoch: 191, iteration: 41000, loss: 0.195757 0.055273, eval loss: 0.199553 0.073077\n",
      "epoch: 196, iteration: 42000, loss: 0.185633 0.024238, eval loss: 0.197766 0.071949\n",
      "epoch: 201, iteration: 43000, loss: 0.138031 0.059162, eval loss: 0.194810 0.074379\n",
      "epoch: 206, iteration: 44000, loss: 0.178554 0.095223, eval loss: 0.199835 0.075145\n",
      "epoch: 210, iteration: 45000, loss: 0.233253 0.077717, eval loss: 0.200409 0.074681\n",
      "epoch: 215, iteration: 46000, loss: 0.294762 0.085637, eval loss: 0.198231 0.073432\n",
      "epoch: 220, iteration: 47000, loss: 0.178815 0.095661, eval loss: 0.197296 0.074957\n",
      "epoch: 225, iteration: 48000, loss: 0.177570 0.278951, eval loss: 0.196790 0.076278\n",
      "epoch: 229, iteration: 49000, loss: 0.154987 0.089310, eval loss: 0.199389 0.078501\n",
      "epoch: 234, iteration: 50000, loss: 0.179198 0.048494, eval loss: 0.203871 0.071420\n",
      "epoch: 239, iteration: 51000, loss: 0.177683 0.089811, eval loss: 0.193467 0.075167\n",
      "epoch: 244, iteration: 52000, loss: 0.202716 0.052338, eval loss: 0.196901 0.076022\n",
      "epoch: 248, iteration: 53000, loss: 0.222153 0.062423, eval loss: 0.201752 0.072515\n",
      "epoch: 253, iteration: 54000, loss: 0.222943 0.093450, eval loss: 0.197370 0.069637\n"
     ]
    }
   ],
   "source": [
    "gridModel = cuda(GridModel())\n",
    "gridOpt = torch.optim.Adam(gridModel.parameters(), GRID_LR)\n",
    "gridLoss1 = nn.MSELoss()\n",
    "gridLoss2 = nn.MSELoss()\n",
    "best_result = {\n",
    "    'model': None,\n",
    "    'opt': None,\n",
    "    'loss': 1e100,\n",
    "    'epoch': 0,\n",
    "    'iteration': 0\n",
    "}\n",
    "if GRID_MODEL != '':\n",
    "    if os.path.exists(model_folder + GRID_MODEL):\n",
    "        best_result = torch.load(model_folder + GRID_MODEL)\n",
    "        gridModel.load_state_dict(best_result['model'])\n",
    "        gridOpt.load_state_dict(best_result['opt'])\n",
    "    else:\n",
    "        print('model file not find:', model_folder + GRID_MODEL)\n",
    "iteration = best_result['iteration']\n",
    "end_epoch = GRID_EPOCH\n",
    "if best_result['epoch'] + GRID_MIN_EPOCH > end_epoch:\n",
    "    end_epoch = best_result['epoch'] + GRID_MIN_EPOCH\n",
    "for epoch in range(best_result['epoch'], end_epoch):\n",
    "    for data in gridTrainDataLoader:\n",
    "        data = list(map(cuda, data))\n",
    "        gridModel.train()\n",
    "        gridOpt.zero_grad()\n",
    "        output = data[-2:]\n",
    "        data = data[:-2]\n",
    "        res = gridModel(*data)\n",
    "        l1 = gridLoss1(res[0], output[0])\n",
    "        l2 = gridLoss2(res[1][output[1] != 0], output[1][output[1] != 0])\n",
    "        #l2 = 0\n",
    "        (l1 / 3 + l2).backward()\n",
    "        gridOpt.step()\n",
    "        if iteration % 1000 == 0:\n",
    "            #print('iteration: %d, loss: %f %f' % (iteration, l1, l2))\n",
    "            #if (random.randint(1,5)==1): break\n",
    "            # test\n",
    "            test_res = []\n",
    "            for data in gridTestDataLoader:\n",
    "                #print(data)\n",
    "                data = list(map(cuda, data))\n",
    "                gridModel.eval()\n",
    "                output = [data[-2].float(), data[-1].float()]\n",
    "                data = data[:-2]\n",
    "                res = gridModel(*data)\n",
    "                #print(res,output)\n",
    "                if res[0].shape != output[0].shape or res[1].shape != output[1].shape:\n",
    "                    print(res, output)\n",
    "                l1 = gridLoss1(res[0], output[0])\n",
    "                l2 = gridLoss2(res[1][output[1] != 0], output[1][output[1] != 0])\n",
    "                #l2 = l1\n",
    "                test_res.append([l1, l2])\n",
    "            test_res = torch.tensor(test_res)\n",
    "            test_res = test_res.mean(dim = 0)\n",
    "            print('epoch: %d, iteration: %d, loss: %f %f, eval loss: %f %f' % (epoch, iteration, l1, l2, test_res[0].item(), test_res[1].item()))\n",
    "            test_res = test_res.mean().item()\n",
    "            torch.save(best_result, model_folder + 'grid/%04d.pt' % epoch)\n",
    "            with open(model_folder + 'grid/log.txt', 'a') as f:\n",
    "                isbest = '\\tbest' if test_res < best_result['loss'] else ''\n",
    "                f.write('%04d %08d %f%s\\n' % (epoch, iteration, test_res, isbest))\n",
    "            if test_res < best_result['loss']:\n",
    "                best_result = {\n",
    "                    'model': gridModel.state_dict(),\n",
    "                    'opt': gridOpt.state_dict(),\n",
    "                    'loss': test_res,\n",
    "                    'epoch': epoch,\n",
    "                    'iteration': iteration\n",
    "                }\n",
    "                torch.save(best_result, model_folder + 'grid/best.pt')\n",
    "        iteration += 1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "RL"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "class DVNNet(nn.Module):\n",
    "    \"\"\"fetch value function\n",
    "    \n",
    "    Args: \n",
    "        GIDnum: number of grids\n",
    "        GIDfeat: grid ID embedding feature number\n",
    "        hourfeat: hour embedding feature number\n",
    "        weekfeat: week embedding feature number\n",
    "    \"\"\"\n",
    "    def __init__(self, hourfeat = 8):\n",
    "        super(DVNNet, self).__init__()\n",
    "        self.houremb = nn.Embedding(24, hourfeat)\n",
    "        \n",
    "        self.fc = nn.Sequential(\n",
    "            nn.Linear(hourfeat + 4, 32),\n",
    "            nn.ReLU(),\n",
    "            nn.Linear(32, 1)\n",
    "        )\n",
    "    \"\"\"\n",
    "    Args:\n",
    "        lat: driver position lat\n",
    "        lon: driver position lon\n",
    "        hour: now hour\n",
    "        average_reward: average reward in this grid\n",
    "        demand: expected demand in this grid\n",
    "    \"\"\"\n",
    "    def forward(self, lat, lon, hour, average_reward, demand):\n",
    "        #print(lat, lon, hour, average_reward, demand)\n",
    "        lat = lat.unsqueeze(1).float()\n",
    "        lon = lon.unsqueeze(1).float()\n",
    "        hour = self.houremb(hour)\n",
    "        average_reward = average_reward.float().unsqueeze(1)\n",
    "        demand = demand.float().unsqueeze(1)\n",
    "        x = torch.cat((lat, lon, hour, average_reward, demand), dim = 1)\n",
    "        #print(x.shape)\n",
    "        return self.fc(x).squeeze()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "class ReplayBuffer:\n",
    "    def __init__(self, maxlen, random = None):\n",
    "        self.position = 0\n",
    "        self.buffer = []\n",
    "        self.maxlen = maxlen\n",
    "        self.full = False\n",
    "        if random == None:\n",
    "            self.rng = np.random\n",
    "        else:\n",
    "            self.rng = random\n",
    "\n",
    "    def __len__(self):\n",
    "        return len(self.buffer)\n",
    "\n",
    "    def append(self, data):\n",
    "        if len(self.buffer) < self.maxlen:\n",
    "            self.buffer.append(data)\n",
    "            if len(self.buffer) == self.maxlen:\n",
    "                self.full = True\n",
    "        else:\n",
    "            self.buffer[self.position] = data\n",
    "            self.position = (self.position + 1) % self.maxlen\n",
    "\n",
    "    def sample(self, batch_size):\n",
    "        choice = self.rng.choice(self.maxlen, batch_size, replace = False)\n",
    "        return [self.buffer[x] for x in choice]\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "class DVN:\n",
    "    def __init__(self, envs, gamma = 0.95, tick = 200, eps = 0.1, random_seed = None,\n",
    "                 iteration = int(1e7), learning_rate = 0.001, replay = 100000, \n",
    "                 update_round = 10000, batch_size = 128, opt = torch.optim.Adam, \n",
    "                 loss = torch.nn.MSELoss, n_steps = 10, TXSWComment = ''):\n",
    "        self.envs = envs\n",
    "        self.GAMMA = gamma\n",
    "        self.TICK = tick\n",
    "        reward_per_sec = 0.0035\n",
    "        reward_tick = reward_per_sec * tick\n",
    "        reward_max = reward_tick / (1 - gamma)\n",
    "        self.REWARD_MAX = reward_max / 2\n",
    "        #print(reward_max)\n",
    "        if type(eps) == type(()) or type(eps) == type([]):\n",
    "            self.EPS = eps[0]\n",
    "            self.EPS_STEP == eps[1]\n",
    "            self.EPS_MIN = eps[2]\n",
    "        else:\n",
    "            self.EPS = self.EPS_MIN = eps\n",
    "            self.EPS_STEP = 0\n",
    "        if random_seed:\n",
    "            self.rng = np.random\n",
    "        else:\n",
    "            self.rng = np.random.RandomState()\n",
    "        self.ITERATION = iteration\n",
    "        self.LR = learning_rate\n",
    "        self.buffer = ReplayBuffer(replay, self.rng)\n",
    "        self.UPDATE = update_round\n",
    "        self.BATCH_SIZE = batch_size\n",
    "        self.model_old = cuda(DVNNet())\n",
    "        self.model_update = cuda(DVNNet())\n",
    "        self.model_old.load_state_dict(self.model_update.state_dict())\n",
    "        self.opt = opt(self.model_update.parameters(), self.LR)\n",
    "        self.loss = loss()\n",
    "        self.N_STEPS = n_steps\n",
    "        self.TXSW = TXSWComment #TODO: tensorboard\n",
    "        self.PREVIOUS_REWARD = []\n",
    "        self.ITERATION = 0\n",
    "        pass\n",
    "        \n",
    "    def get_action(self, actions):\n",
    "        self.model_update.eval()\n",
    "        res = []\n",
    "        now_time = self.infos['time']\n",
    "        news = [x.copy() for x in self.states]\n",
    "        with torch.no_grad():\n",
    "            for num, a in enumerate(actions):\n",
    "                if self.rng.random() < self.EPS:\n",
    "                    res.append(self.rng.randint(0, len(a[0])))\n",
    "                else:\n",
    "                    [endlat, endlon] = a[2:4]\n",
    "                    t = now_time[num].astype(int)\n",
    "                    eta = a[4].astype(int)\n",
    "                    #print(self.states, self.infos)\n",
    "                    #print(eta, t)\n",
    "                    end_time = (eta + t) % 86400 // 3600\n",
    "                    news = [a[2], a[3], end_time, self.states[3][num:num+1].repeat(len(a[0]), 0), self.states[4][num:num+1].repeat(len(a[0]), 0)]\n",
    "                    #print(news)\n",
    "                    # TODO: reward order update\n",
    "                    news = [cuda(torch.tensor(x)) for x in news]\n",
    "                    v = self.model_old(*news).cpu().detach().numpy()\n",
    "                    #print(a[4:])\n",
    "                    #print(v)\n",
    "                    tick = a[4] // self.TICK + 1\n",
    "                    #print(tick)\n",
    "                    gamma = self.GAMMA ** tick\n",
    "                    v = gamma * v + a[5] / self.REWARD_MAX / tick * (1 - gamma) / (1 - self.GAMMA)\n",
    "                    #print(v)\n",
    "                    fail_tick = 600 // self.TICK\n",
    "                    v = v * (1 - a[6]) / (1 - self.GAMMA ** fail_tick * a[6])\n",
    "                    #print(v)\n",
    "                    #print('-----')\n",
    "                    res.append(np.argmax(v).item())\n",
    "        return res\n",
    "    \n",
    "    def real_update_v(self, states, next_s, reward, length):\n",
    "        self.model_update.train()\n",
    "        self.model_old.eval()\n",
    "        v = self.model_update(*states)\n",
    "        next_v = self.model_old(*next_s)\n",
    "        self.PREVIOUS_REWARD += next_v.squeeze().detach().cpu().numpy().tolist()\n",
    "        #print(states, next_s)\n",
    "        gamma = (self.GAMMA ** (length // self.TICK))\n",
    "        reward_b = reward + next_v * gamma\n",
    "        #print(v, reward_b)\n",
    "        #print(v.min(), reward_b.min(), v.max(), reward_b.max())\n",
    "        #print(v.mean(), reward_b.mean())\n",
    "        #print(reward.mean())\n",
    "        L = self.loss(v, reward_b)\n",
    "        L.backward()\n",
    "        self.opt.step()\n",
    "        return L.item()\n",
    "    \n",
    "    def update_v(self, next_s, reward, length):\n",
    "        gamma = (self.GAMMA ** (length // self.TICK + 1))\n",
    "        reward = reward / self.REWARD_MAX / (length // self.TICK + 1) * (1 - gamma) / (1 - self.GAMMA)\n",
    "        res = []\n",
    "        for data in zip(*self.states, *next_s, reward, length):\n",
    "            self.buffer.append(data)\n",
    "            if self.buffer.full:\n",
    "                data = list(zip(*self.buffer.sample(self.BATCH_SIZE)))\n",
    "                data = [cuda(torch.tensor(x)) for x in data]\n",
    "                #print(data)\n",
    "                slen = len(self.states)\n",
    "                loss = self.real_update_v(data[:slen], data[slen:slen * 2], *data[slen * 2:])\n",
    "                res.append(loss)\n",
    "        return res\n",
    "        \n",
    "    def sampling(self):\n",
    "        actions = self.envs.get_actions()\n",
    "        #print(actions)\n",
    "        act = self.get_action(actions)\n",
    "        #print(act)\n",
    "        next_s, reward, length, infos = self.envs.step(act)\n",
    "        loss = self.update_v(next_s, reward, length)\n",
    "        self.ITERATION += 1\n",
    "        if self.buffer.full and self.ITERATION % self.UPDATE == 0:\n",
    "            self.model_old.load_state_dict(self.model_update.state_dict())\n",
    "        if self.ITERATION % 1000 == 0:\n",
    "            if len(loss) != 0:\n",
    "                print(self.ITERATION, np.mean(self.PREVIOUS_REWARD[-50 * self.BATCH_SIZE:]), np.mean(loss))\n",
    "            else:\n",
    "                print(self.ITERATION)\n",
    "        self.states = next_s\n",
    "        self.infos = infos\n",
    "        \n",
    "    def one_round(self):\n",
    "        s, infos = self.envs.reset()\n",
    "        self.states = s\n",
    "        self.infos = infos\n",
    "        for i in range(self.N_STEPS):\n",
    "            self.sampling()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1000 -0.13885559026181 0.34335565865039824\n",
      "2000 0.705652117729187 0.3746249839663506\n",
      "3000 1.514778733253479 0.1764090158045292\n",
      "4000 1.7241647243499756 0.18267909362912177\n",
      "5000 2.0417590141296387 0.14538522064685822\n",
      "6000 2.1796131134033203 0.1318306501954794\n",
      "7000 2.089500665664673 0.2659283116459846\n",
      "8000 2.497218370437622 0.22772029936313629\n",
      "9000 2.7680904865264893 0.1886766791343689\n",
      "10000 2.36509370803833 0.17787406519055365\n",
      "11000 2.078965187072754 0.13345589227974414\n",
      "12000 2.070830821990967 0.23603601902723312\n",
      "13000 2.448685884475708 0.18390462324023246\n",
      "14000 2.638989210128784 0.10955246314406394\n",
      "15000 2.4584896564483643 0.20872316807508468\n",
      "16000 2.706465721130371 0.11424713879823685\n",
      "17000 2.6760499477386475 0.2137204810976982\n",
      "18000 2.8842997550964355 0.1820662371814251\n",
      "19000 2.9875752925872803 0.09826862588524818\n",
      "20000 2.7510006427764893 0.2576478563249111\n",
      "21000 2.239650249481201 0.15007682032883168\n",
      "22000 2.4222471714019775 0.14954908117651938\n",
      "23000 2.2801859378814697 0.25861022621393204\n",
      "24000 2.6440000534057617 0.11766403019428254\n",
      "25000 2.4825797080993652 0.17235909327864646\n",
      "26000 2.2060546875 0.12675379812717438\n",
      "27000 2.2747933864593506 0.22848158627748488\n",
      "28000 2.6128594875335693 0.6422524213790893\n",
      "29000 3.2521142959594727 0.11972979865968228\n",
      "30000 2.83276629447937 0.21013016402721404\n",
      "31000 2.999577522277832 0.2297429472208023\n",
      "32000 2.430112838745117 0.22964008450508117\n",
      "33000 2.719294309616089 0.15896178558468818\n",
      "34000 2.3404548168182373 0.12534992173314094\n",
      "35000 2.4030957221984863 0.24455822706222535\n",
      "36000 2.729109048843384 0.17379335910081864\n",
      "37000 2.3086488246917725 0.1857553396373987\n",
      "38000 2.036713123321533 0.20631794556975364\n",
      "39000 1.8257335424423218 0.178882372751832\n",
      "40000 1.7347872257232666 0.18761995062232018\n",
      "41000 2.0533578395843506 0.2668615229427814\n",
      "42000 2.46907377243042 0.8146590143442154\n",
      "43000 3.2440311908721924 0.12574472539126874\n",
      "44000 3.1667191982269287 0.236094069480896\n",
      "45000 3.2837905883789062 0.12555024698376654\n",
      "46000 3.174326181411743 0.13725207448005677\n",
      "47000 2.7190799713134766 0.11333928257226944\n",
      "48000 2.5091211795806885 0.26002117320895196\n",
      "49000 2.054255723953247 0.5800767451524734\n",
      "50000 2.792785167694092 0.14731714501976967\n",
      "51000 2.466252088546753 0.18976964056491852\n",
      "52000 2.6917338371276855 0.2419134832918644\n",
      "53000 2.940591335296631 0.22477262914180757\n",
      "54000 2.4008467197418213 0.2306458242237568\n",
      "55000 2.6878161430358887 0.21835092455148697\n",
      "56000 2.2411646842956543 0.21602275222539902\n",
      "57000 1.9319839477539062 0.15317200422286986\n",
      "58000 1.8988463878631592 0.26087005361914634\n",
      "59000 1.6706204414367676 0.2599158398807049\n",
      "60000 1.4727697372436523 0.19342077821493148\n",
      "61000 1.543313980102539 0.2703718408942223\n",
      "62000 2.0539968013763428 0.2696415953338146\n",
      "63000 1.749314546585083 0.24398373141884805\n",
      "64000 2.2146027088165283 0.22580019012093544\n",
      "65000 1.8792569637298584 0.24146840199828148\n",
      "66000 1.6715595722198486 0.24031100496649743\n",
      "67000 2.0975780487060547 0.2391708843410015\n",
      "68000 1.793702483177185 0.1683877930045128\n",
      "69000 1.7991803884506226 0.1420181557536125\n",
      "70000 1.9994956254959106 0.2592072382569313\n",
      "71000 2.4237749576568604 0.21286093294620514\n",
      "72000 2.045839786529541 0.1487246960401535\n",
      "73000 1.9843926429748535 0.22276331707835198\n",
      "74000 2.348968505859375 0.9119835317134857\n",
      "75000 3.213148355484009 0.1963188350200653\n",
      "76000 3.3022866249084473 0.18132225647568703\n",
      "77000 3.3370516300201416 0.09920954816043377\n",
      "78000 3.0602433681488037 0.23212904781103133\n",
      "79000 3.2141685485839844 0.22315800413489342\n",
      "80000 2.614968776702881 0.12441215589642525\n",
      "81000 2.618847370147705 0.16528138220310212\n",
      "82000 2.3087704181671143 0.16637704372406006\n",
      "83000 2.047024726867676 0.23122893124818802\n",
      "84000 2.3988444805145264 0.1827748380601406\n",
      "85000 2.6351511478424072 0.24971653446555137\n",
      "86000 2.889425039291382 0.13422032147645951\n",
      "87000 2.5032708644866943 0.12960803434252738\n",
      "88000 2.5967700481414795 0.25806364193558695\n",
      "89000 2.1245274543762207 0.16374507397413254\n",
      "90000 2.351708173751831 0.1360613524913788\n",
      "91000 2.4773504734039307 0.19969267919659614\n",
      "92000 2.700817108154297 0.10373947881162167\n",
      "93000 2.6705877780914307 0.23288289979100227\n",
      "94000 2.898974895477295 0.2414407715201378\n",
      "95000 2.3691470623016357 0.23590960055589677\n",
      "96000 1.97931706905365 0.24831369817256926\n",
      "97000 1.7108980417251587 0.15750940442085265\n",
      "98000 1.8990405797958374 0.2787190586328506\n",
      "99000 2.37068772315979 0.23282048031687735\n",
      "100000 1.9761605262756348 0.17369362935423852\n",
      "over\n"
     ]
    }
   ],
   "source": [
    "dvn = DVN(get_carenvvec(20), replay = 10000, update_round = 1000)\n",
    "#dvn = DVN(get_carenvvec(2), replay = 200, update_round = 10)\n",
    "for i in range(10000):\n",
    "    dvn.one_round()\n",
    "print('over')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "101000 2.255737781524658 0.1428387962281704\n",
      "102000 2.08195424079895 0.13487432524561882\n",
      "103000 2.0993199348449707 0.1631439719349146\n",
      "104000 1.9503875970840454 0.24294679686427118\n",
      "105000 2.368703603744507 0.1815752148628235\n",
      "106000 2.092811346054077 0.16513948142528534\n",
      "107000 1.9647623300552368 0.2623859718441963\n",
      "108000 2.400290012359619 0.18829355910420417\n",
      "110000 2.3245131969451904 0.14436614885926247\n",
      "111000 2.1280946731567383 0.28604927062988283\n",
      "112000 1.7770822048187256 0.24171838983893396\n",
      "113000 2.2098515033721924 0.24522450268268586\n",
      "114000 1.8675479888916016 0.23094694763422013\n",
      "115000 1.7083847522735596 0.2632015645503998\n",
      "116000 1.5444869995117188 0.2561440035700798\n",
      "117000 1.4534945487976074 0.2696437783539295\n",
      "118000 2.00384783744812 0.14097939655184746\n",
      "119000 1.959337830543518 0.18298693671822547\n",
      "120000 2.2493607997894287 0.21350654512643813\n",
      "121000 1.9188350439071655 0.1517300896346569\n",
      "122000 1.9116945266723633 0.16057495921850204\n",
      "123000 2.171973705291748 0.23477180153131486\n",
      "124000 2.5372326374053955 0.14859869405627252\n",
      "125000 2.240114688873291 0.14348110295832156\n",
      "126000 2.037606954574585 0.22921461537480353\n",
      "127000 2.391542434692383 0.15233029350638388\n",
      "128000 2.5648908615112305 0.18680210635066033\n",
      "129000 2.199774980545044 0.2666711464524269\n",
      "130000 1.8503844738006592 0.26814206689596176\n",
      "131000 1.6002384424209595 0.2666935048997402\n",
      "132000 2.083665609359741 0.1627180203795433\n",
      "133000 1.9545347690582275 0.14930523931980133\n",
      "134000 1.910779595375061 0.22449889853596688\n",
      "135000 2.2824912071228027 0.1589024268090725\n",
      "136000 2.088700771331787 0.1645856559276581\n",
      "137000 1.868009090423584 0.2800244718790054\n",
      "138000 1.6070475578308105 0.25221759006381034\n",
      "139000 2.0940401554107666 0.20274825319647788\n",
      "140000 1.8765164613723755 0.2157619409263134\n",
      "141000 1.7362624406814575 0.2912979036569595\n",
      "142000 2.2373440265655518 0.2569052308797836\n",
      "143000 2.601372480392456 0.14069403745234013\n",
      "144000 2.7146553993225098 0.17675863280892373\n",
      "145000 2.3174455165863037 0.21115130111575126\n",
      "146000 2.615119218826294 0.1816912844777107\n",
      "147000 2.7629849910736084 0.14350639395415782\n",
      "148000 2.4012625217437744 0.12101470530033112\n",
      "149000 2.427663803100586 0.10973928570747375\n",
      "150000 2.267670154571533 0.1485675796866417\n",
      "151000 2.4109466075897217 0.11459804847836494\n",
      "152000 2.400869369506836 0.14379125460982323\n",
      "153000 2.536308526992798 0.12187061719596386\n",
      "154000 2.3654990196228027 0.2029296100139618\n",
      "155000 2.6167728900909424 0.7678402662277222\n",
      "156000 1.684593677520752 0.2559814237058163\n",
      "157000 2.1592462062835693 0.2918288424611092\n",
      "158000 2.576317548751831 0.21251820996403695\n",
      "159000 2.8213069438934326 0.22683784738183022\n",
      "160000 3.0179057121276855 0.1658833272755146\n",
      "161000 2.5509066581726074 0.13555418998003005\n",
      "162000 2.6429455280303955 0.11361589431762695\n",
      "163000 2.5673155784606934 0.234382763504982\n",
      "164000 2.8442869186401367 0.11992685347795487\n",
      "165000 2.806840419769287 0.23877053558826447\n",
      "166000 2.3000662326812744 0.13549166023731232\n",
      "167000 2.1451220512390137 0.25214868783950806\n",
      "168000 1.8183039426803589 0.2033853493630886\n",
      "169000 1.6692166328430176 0.29897898286581037\n",
      "170000 1.4877336025238037 0.19889722764492035\n",
      "171000 1.8808214664459229 0.16203390806913376\n",
      "172000 2.0946755409240723 0.1427633285522461\n",
      "173000 2.2272441387176514 0.2690762937068939\n",
      "174000 2.6055428981781006 0.12105628699064255\n",
      "175000 2.6011359691619873 0.18691158890724183\n",
      "176000 2.2263550758361816 0.24827100113034248\n",
      "177000 2.5813753604888916 0.23126367703080178\n",
      "178000 2.8459322452545166 0.17134136334061623\n",
      "179000 2.4326436519622803 0.24193790182471275\n",
      "180000 2.7405457496643066 0.13352818302810193\n",
      "181000 2.810415267944336 0.22033630982041358\n",
      "182000 2.3072705268859863 0.19949038252234458\n",
      "183000 2.001981258392334 0.13119428120553495\n",
      "184000 2.0446982383728027 0.23299856781959533\n",
      "185000 1.7571324110031128 0.24213425144553186\n",
      "186000 2.1709320545196533 0.22876089066267014\n",
      "187000 2.521211862564087 0.2020631328225136\n",
      "188000 2.7505457401275635 0.19985852614045144\n",
      "189000 2.3123021125793457 0.1567522257566452\n",
      "190000 2.503774881362915 0.2454726405441761\n",
      "191000 2.0596415996551514 0.17466151751577855\n",
      "192000 1.9021883010864258 0.1816732920706272\n",
      "193000 2.153160810470581 0.26189940571784975\n",
      "194000 1.837929606437683 0.1486962355673313\n",
      "195000 2.017409563064575 0.20618762075901031\n",
      "196000 2.372652530670166 0.18192809149622918\n",
      "197000 2.0628161430358887 0.14556808285415174\n",
      "198000 2.262204647064209 0.17288858070969582\n",
      "199000 2.4772305488586426 0.2211728185415268\n",
      "200000 2.7518811225891113 0.2194206528365612\n",
      "over\n"
     ]
    }
   ],
   "source": [
    "for i in range(10000):\n",
    "    dvn.one_round()\n",
    "print('over')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor(0., grad_fn=<StdBackward0>)"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "net = DVNNet()\n",
    "net.load_state_dict(dvn.model_old.state_dict())\n",
    "lat = np.expand_dims(np.arange(50), 1).repeat(50, 1).astype(float) / 50 - 0.01\n",
    "lon = lat.copy().T\n",
    "lat = lat.reshape(-1)\n",
    "lon = lon.reshape(-1)\n",
    "hour = np.random.randint(0, 24, 2500)\n",
    "order = np.random.normal(0, 1, 2500)\n",
    "reward = np.random.normal(0, 1, 2500)\n",
    "args = [lat, lon, hour, order, reward]\n",
    "args = [torch.tensor(x) for x in args]\n",
    "res = net(*args)\n",
    "res.std()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [],
   "source": [
    "torch.save({'model': dvn.model_old.state_dict()} , 'DVNNet.pt')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([-0.2047, -0.1108, -0.7740,  0.0084], grad_fn=<SqueezeBackward0>)"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "net = DVNNet()\n",
    "args = [np.array([0.59284462, 0.14675589, 0.93154087, 0.07072488]), np.array([0.84426575, 0.09233859, 0.94773061, 0.83994904]), np.array([18, 20, 20, 19]), np.array([ 0.        ,  0.        , 16.61142857,  0.        ]), np.array([0., 0., 7., 0.])]\n",
    "args = [torch.tensor(x) for x in args]\n",
    "net(*args)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 0.03483273  0.5752359   0.12843129 -0.4650737  -0.94907194  1.3187205\n",
      "   0.11801317  1.297002  ]\n",
      " [-1.0432663   0.60687953 -2.254324   -0.5188085  -0.7370148  -0.46014753\n",
      "  -0.3195952  -0.73632467]\n",
      " [ 0.14155225  0.53826916  2.3159065  -1.0485636  -0.6554089  -1.5815444\n",
      "   0.00392956 -2.3259454 ]\n",
      " [-1.296141   -0.79721963  0.97293687 -0.96016055 -0.03817661  0.5457999\n",
      "   0.8235343   1.1403784 ]\n",
      " [-0.51540214 -1.2390755  -0.76044333 -0.9409071  -0.13243608  0.47036278\n",
      "  -0.31675145  0.41867542]\n",
      " [-0.7187082  -1.9026791  -1.262127    1.8128377  -0.40294275 -0.14427537\n",
      "   1.0668734   0.21636559]\n",
      " [-0.11375018  0.6594905  -0.5301657  -0.74703425 -1.4256139   0.27450582\n",
      "   0.32764453  0.07545137]\n",
      " [-1.6850967   0.59464437  1.0403318  -1.3888961   0.68569857 -0.70625734\n",
      "   0.62221855  0.92507154]\n",
      " [ 0.91795826 -0.09929796  0.9493551   1.0999976  -1.1777453  -0.2963917\n",
      "  -0.7966592  -1.94899   ]\n",
      " [-1.5366273  -0.43665996  0.06043153 -0.25245214  0.4218636   0.19649306\n",
      "   0.4629104  -1.4364601 ]\n",
      " [ 0.4325093   0.8446637   0.67006385  0.15992066  0.6635511   0.30359936\n",
      "  -0.10520756 -0.48868564]\n",
      " [ 1.4635539  -0.24629653  1.7840244   1.3012761   0.7098061   0.4213302\n",
      "   0.80500823 -0.4393702 ]\n",
      " [ 1.0252942   1.4209175   0.40247256  0.4195219  -0.33783293 -0.65600467\n",
      "   0.7615571   0.75256777]\n",
      " [ 0.51525307  1.1325479  -1.6418811   0.43953478 -0.8251192   0.08938257\n",
      "  -1.807838   -0.23806034]\n",
      " [ 0.450091   -0.23481263 -0.38589612  0.29975572 -0.63533473 -0.2853488\n",
      "  -0.5910608  -0.49831802]\n",
      " [-0.46256524 -0.0764505   0.13463995 -0.03419879  0.28441608  0.44516262\n",
      "  -0.23715794  1.3332077 ]\n",
      " [ 0.0224917   1.0306008   1.4974823  -0.34782574  0.9063076  -2.0709987\n",
      "   0.807062    2.1500661 ]\n",
      " [-2.0182505   1.3267813   0.29195583  0.22574879 -1.950721    0.2940364\n",
      "  -0.8059239  -0.37982145]\n",
      " [ 0.50986767  0.5339766   0.4128358   1.2103145  -0.48550788 -1.5566325\n",
      "  -0.24549553  0.2595441 ]\n",
      " [ 0.24704596 -1.7894734   0.3889095   0.813704   -2.2689977  -0.33839247\n",
      "   0.07941408 -2.2761588 ]\n",
      " [ 0.3997262  -0.9647549  -0.5191027   2.3638659   0.24483767  0.3876522\n",
      "   0.384929    1.3513002 ]\n",
      " [-0.2643619   0.16807827 -0.0682897  -1.1181718   0.14474852 -0.77982223\n",
      "  -0.80379486  3.3212826 ]\n",
      " [-1.1626172   1.249119   -0.5950293   0.28557372  0.56042945 -1.9539094\n",
      "  -0.03120504 -1.2736589 ]\n",
      " [ 0.51477337  0.07894385 -0.98523706  0.5709181   1.3779233   0.03198597\n",
      "  -0.02802421  0.40776613]]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 2.007002   -0.5444778   0.13813953  2.2049806 ]\n",
      " [ 0.13474026  1.6930089  -0.44278076 -0.3833948 ]\n",
      " [ 0.00522539  0.2952756  -1.4401698  -0.8471587 ]\n",
      " [-0.8392843  -1.0302026   1.9816213   0.6493134 ]\n",
      " [-0.26154727  0.3918539   0.40304488 -0.37173355]\n",
      " [ 0.5554839  -0.44442958 -1.3740333   2.0925484 ]\n",
      " [ 0.98985183 -0.05577741  0.07827802  0.48818392]]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "drawTSNE(range(24), range(24), gridModel.houremb)\n",
    "drawTSNE(range(7), range(7), gridModel.weekemb)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 0.914455   -0.5903582   1.1530627   0.30412522]\n",
      " [-0.33720794 -1.264809    1.414949    1.7721734 ]\n",
      " [-0.2968548  -1.4349606   1.253467    0.49732742]\n",
      " [ 1.6517937  -0.75685644  0.18583392 -0.93345165]\n",
      " [-0.17315787 -0.21904357 -0.06030564  0.43312943]\n",
      " [ 0.4363799  -0.19208407  0.28546104  0.04854025]\n",
      " [-0.69396067  0.33243418  1.3796642   0.01266043]\n",
      " [ 0.5632189  -0.6398172  -0.96168566 -0.31252143]\n",
      " [-0.7576503  -1.8796755  -0.09659315  0.9368106 ]\n",
      " [-0.22491632 -0.6720232   1.0299195   1.0965035 ]\n",
      " [-2.3463383  -0.7753797   0.0460392   0.75587505]\n",
      " [-0.48186862 -0.9461284   1.0251328  -0.16843994]\n",
      " [-0.7237842  -0.985791    0.09095516 -1.088165  ]\n",
      " [ 0.18080433 -0.49396813  0.32142368 -0.10139823]\n",
      " [ 0.5488926   0.6966787   0.16029985 -1.1921129 ]\n",
      " [-0.3346263  -0.35490668 -0.0282834  -0.18998827]\n",
      " [-1.1913027  -1.3730667   0.01163548 -1.9679252 ]\n",
      " [ 0.41258374 -0.8278788  -1.0981814  -1.1086373 ]\n",
      " [ 0.85091305 -0.65953207  0.43872738  0.13128309]\n",
      " [ 0.10708154 -0.32813478  1.8109577   0.13738723]\n",
      " [ 0.925878   -0.547022   -0.252584   -0.75367165]\n",
      " [-0.09454056 -0.07045842 -0.19072652 -1.6179044 ]\n",
      " [ 1.2604898   1.2075665  -0.19117625 -0.73727655]\n",
      " [ 0.55954766  0.98823565  0.97405183 -1.1156816 ]]\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAWgAAAD8CAYAAABaZT40AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAHV9JREFUeJzt3Xl0lfW97/H3d+8MkBAIMSkgAUHFASfUqNTaausE1or2aCu2trae4umpt8O1k21vvctzzzrWe1rv8eDRRZWl9ji2daC3OODQyznXoQS0qOCAKNcwBlAIZtrD9/6xd2jAkOywn+zn2Tuf11rPyh6ePL/vFvPNL9/nN5i7IyIi0RMLOwAREembErSISEQpQYuIRJQStIhIRClBi4hElBK0iEhEKUGLiESUErSISEQpQYuIRFRZ2AHsS319vU+ZMiXsMESkCCxfvnyruzfkc41zP13t27ancmtvZdcT7j4rn/ZyEdkEPWXKFJqbm8MOQ0SKgJmty/ca27an+PMTk3M6Nz7hrfp828tFZBO0iEghOZAmHXYYe1CCFhEBHCfhuZU4CkUJWkQkSz1oEZEIcpxUxJZfVoIWEclKowQtIhI5DqQilqDznqhiZpPM7FkzW2Vmr5nZd/o4x8zsZjNbY2YrzeyEfNuVcHSnkyzd8hde2LqKtEerXieSrzSe01EoQfSgk8A17r7CzGqA5Wa2xN1X9TpnNjAte5wC3Jr9KkUk7WmueekW3vlwE+B8ov4Yrp3+pbDDEgmEA4mI1aDz7kG7+0Z3X5F93AasBibuddoc4G7PeAGoNbMJ+bYthdXatYM1u9bTkeqiI9XNM5tXoD0tpVQ4TirHo1ACrUGb2RTgeODFvd6aCLzX63lL9rWNQbYvQ2tMeTVxiwNJDKOhshYzCzsskWA4pCLW3whssSQzGwX8Hviuu+/cz2vMM7NmM2tubW0NKjQJyIh4BTcedxVHjZ7CCWOnceOMvws7JJHAZGYS5nYUSiA9aDMrJ5Oc73H3h/o4ZT0wqdfzxuxre3D3BcACgKampoj9LhOA6WOmcPOJ3w47DJEhYKSI1l+EQYziMOAOYLW7/2ofpy0CvpIdzTET2OHuKm+ISGRkbhJaTkehBNGD/gRwOfCKmb2cfe0nwGQAd78NWAycB6wB2oGvBdCuiEhgMuOgo9WDzjtBu/t/Qv+fyjO3+r+Vb1siIkMpXcDecS40k1BEhBLtQYuIlALHSEVsF0AlaBGRLJU4REQiyDG6PR52GHtQghYRoWeiikocIiKRpJuEIiIR5G6kXD1oEZFISkesBx2tXxciIiHJ3CQsy+kYyL42MjGzOjNbYmZvZb+O7e86StAiIvz1JmEuRw56NjKZDswEvmVm04EfA0+7+zTg6ezzfVKCFhHJSrnldAykn41M5gB3ZU+7C7iwv+uoBi0iwtDNJNxrI5NxvVby3ASM6+97laBFRLLSuY/iqDez5l7PF2TXs9/D3huZ9N6ByN3dzPpd914JWkSEnsWSck7QW929qb8T9rGRyWYzm+DuG7P7sm7p7xqqQYuIkClxJDye0zGQfjYyWQR8Nfv4q8Cj/V1HPWgREcCdICeq7GsjkxuAB83sSmAd8IX+LqIELSICgAU2UWWAjUzOzPU6StAiImRr0JrqLSISTVqwX0QkghzTgv0iIlHkQCKHdTYKKVrRiIiExiK3HnQgBRczW2hmW8zs1X28f4aZ7TCzl7PHz4NoV0QkKE5mJmEuR6EE1YO+E5gP3N3POf/h7ucH1J6ISOCi1oMOJEG7+9LsgiAiIkXJ3QraO85FIWvQHzezvwAbgO+7+2sFbFtEpF+Zm4TDc1fvFcBB7r7LzM4DHgGm7X2Smc0D5gFMnjy5QKGJiABEb0/CgkTj7jvdfVf28WKg3Mzq+zhvgbs3uXtTQ0NDIUITEQF6bhJaTkehFKQHbWbjgc3Z9U9PJvOLYVsh2hYRyVVJziQ0s/uAM8gsYt0CXAeUA7j7bcDFwDfNLAl0AJe6e78LVYuIFFLJziR097kDvD+fzDA8EZHIynFD2ILRTEIRETLrQSfSStAiIpGTKXEoQYtIiXF3em+IWqxKciahiAxPr2zYxLx7H2FHZydXnHICPzz7U2GHtN96htlFSbT68yJSVH70yBNsb+8glXbuaf4Lqzf1u0l1xFnJLpYkIsNQZyK5+3EM2+N5MQpqT8KgqActIvvtuvM+Q2VZGRXxOB8/eDLHNU4IO6T9lhnFEc/pKBT1oEVkv50+bSrPXXMVu7q6GFczqqhvFJbsRBURGb5GVVYwqrIi7DACEbUShxK0iAjRHMWhBC0ikqWJKiIiEeRuJJWgRUSiSSUOGZaeefdtFq5cwSFj6/jRzE9SVV4aN5WkdKgGLcPSm9u38q0n/0BHMsmyjS3s6u7il2eeF3ZYIh+hBC3DzlvbtxGzTG2vK5Vi5ZbNIUck8lEaBy3D0skHNlIWMyrjceIW4+Ijjgo7JJE+aRy0DDsNVdU8/sUreOrdNUwaXcsZk6eGHZLIR7hDUgv2y3A0YVQNlx99fNhhiPRLJY5hqivVxQPvPcrGzk3MHn8mx9bqz3yRKFENehi7/Z17eHHbchKeYNXON/mnY37GgSPHhx2WiPTiEUvQ0Sq4lLC3d71DwhMAxInR0rEh5IhEZG9pLKejUAJJ0Ga20My2mNmr+3jfzOxmM1tjZivN7IQg2i0mn6yfSWWsgjIrI2YxDht1aNghiUgv7pkadC5HoQRV4rgTmA/cvY/3ZwPTsscpwK3Zr8PGhRPPY1LVRFq7tnFS3QxqK0aHHZKI7MFIleIoDndfamZT+jllDnC3uzvwgpnVmtkEd98YRPvFwMxoqpsRdhgi0o+gatBmthA4H9ji7kdnX/vvwDeA1uxpP3H3xf1dp1C/LiYC7/V63pJ9TUQkEnrW4gioxHEnMKuP129y9xnZo9/kDBG7SWhm88ys2cyaW1tbB/4GEZGgeKYOncsx4KXclwLb8w2pUAl6PTCp1/PG7Gt7cPcF7t7k7k0NDQ0FCk1EJKMAoziuzg6UWGhmYwc6uVAJehHwlexojpnAjuFUfxaR6PPsTcJcDqC+56/97DEvhyZuBQ4BZgAbgV8O9A2B3CQ0s/uAM8gE3QJcB5QDuPttwGLgPGAN0A58LYh2RUSClEv5ImuruzcN7tq+exlHM/s18L8H+p6gRnHMHeB9B74VRFsiIkNlKGcS7jVy7SKgz3kjvWmqt4gIPTcAAxtm11dV4Qwzm0FmwMi7wFUDXUcJWkQkK6hZgvuoKtwx2OsoQYuIZA2iBl0QStAiImSXGy3Fqd4iIqUgYh1oJeih0JXcyFtbv0dXcgONY/6ecTWXhh2SyEe8um4Tv3lmORPGjuaq2TMZWVkedkjhCvAmYVCUoIfAm1u/S1vXciDNO+9fT03lCVRVHBZ2WCK7te7YxTdu/h0d3QkqyuKsa32fm75xQdhhhS9iXehoFVxKRHdyI5AGwIjTndoSbkAie3ln03bisUxvsTuZ4pV3NbEXMj3oXI5CUYIeAo1j/p6YjSBu1VTEJ1BTOagJRyJD7ohJHyMej1EWizGiooxPH6sNJBxIpy2no1BU4hgC42oupabyBLpTm6mpPIl4bETYIYnsYXTVCB740ZdZvGw1DWNG8dmTjgw7pPA5oBr08FBVcRhVqO4s0TV+bA1fP+fksMOIFI2DFhGJKiVoEZEoKuwNwFwoQYuI9FAPWkQkghy8gCM0cqEELSKymxK0iEg0qcQhIhJRStAiIhGkiSoiItGliSoiIlGlURwiItFkEetBB7KanZnNMrM3zGyNmf24j/evMLNWM3s5e/xtEO2KiATGB3EUSN49aDOLA7cAZwMtwDIzW+Tuq/Y69QF3vzrf9mRgXYkkbe1dHDC6CrNo/ckmEl1WkjcJTwbWuPtaADO7H5gD7J2gpQBeeXsDV//zQySSKWYcNpGb/+vnKYtr2W+RnJRgiWMi8F6v5y3Z1/b2N2a20sx+Z2aTAmhX+vDLe/5Ee2c3iWSKV9/eyPOvvBt2SCLFI53jUSCF6lr9AZji7scCS4C7+jrJzOaZWbOZNbe2thYotNJSXrbnP6l6zyI56hkHnctRIEH89K4HeveIG7Ov7ebu29y9K/v0duDEvi7k7gvcvcndmxoaGgIIbfj50VfOom50FWZw+vGHcMpRB4UdkkjRMM/tKJQgatDLgGlmNpVMYr4UuKz3CWY2wd17dqW8AFgdQLvSh0Mb63niX/6OVDpNPKbes8igRKwGnXeCdvekmV0NPAHEgYXu/pqZXQ80u/si4NtmdgGQBLYDV+TbrvRPyVmk+AUyUcXdFwOL93rt570eXwtcG0RbIiJDJWoTVTSTUEK3M9HB861rmDCylmPHaoCPhMTRVG+R3nYlOrl46Xx2JTpJ43zn8HOYO3Vm2GHJcBWxHrQKlRKqFdvX8WGii/ZUN52pBPe++3zYIckwVoqjOET224FVtaQ8M/K/zGJMHaXhlRIi9aBF/urQmnFcd+wcDqsZz+njjuD64z4fdkgynJXaYkki+Zo98ThmTzwu7DBkmCt0+SIXStAiIj00ikNEJJrUgxYRiSolaBGRCIpgDVqjOEREegQ0isPMFprZFjN7tddrdWa2xMzeyn4dO9B1lKBFRLIsnduRgzuBWXu99mPgaXefBjydfd4vJWgRkYC5+1IyK3f2Noe/blZyF3DhQNdRDVpEpEfuNeh6M2vu9XyBuy8Y4HvG9VoXfxMwbqBGlKBFRGCwNwm3unvTfjfl7mYDt6YSh4hIj6Gd6r3ZzCZAZpcpYMtA36AELSLSY2gT9CLgq9nHXwUeHegbVOIQycH851/gjublTKip4dYLL+Cg2tqwQ5KAGTmP0Bj4Wmb3AWeQqVW3ANcBNwAPmtmVwDrgCwNdRwlaZAArN27ithf/TEcySVtXFz947HEenHtp2GFJ0AKcqOLuc/fx1pmDuY4StMgAPujsJGaZRXQc2N7eEW5AMnQ0k1CkuJwyqZGpdWOpKi9nRFkZP/jkaWGHJENF60FLf3Z2v8v7Xa9TP+JYqssPDDscASrLyvj9ly7j9dZWGqqrGTdqVNghyRCJ2locgSRoM5sF/AsQB2539xv2er8SuBs4EdgGfNHd3w2i7VLS2vEy/2fDf8GIAc6ZjQuprTw07LAEKIvFOHrcgPMKpNhFLEHnXeIwszhwCzAbmA7MNbPpe512JfC+ux8K3AT8It92S9HanY+Q8k6S3k7SO3lv11NhhyQyfHiga3EEIoga9MnAGndf6+7dwP1k5pz31nsO+u+AM80sWlsXRMDoioOJWyUAcaukpmJyyBGJDDMlWIOeCLzX63kLcMq+znH3pJntAA4AtgbQfsk4vPYyOpPb2NyxjMbqMzho1OywQyoKWzbt4H9c9xBbNu/k0i+fyoUXnxR2SFKkSrIGHRQzmwfMA5g8efj1HmNWxvEN3ws7jKJzwz88yuurNuAOt9/6DMccN5lDpqleLPshYgk6iBLHemBSr+eN2df6PMfMyoAxZG4W7sHdF7h7k7s3NTQ0BBCaDAdbt7bh2R+sWDzG9u27wg1IilOu5Y0CJvEgEvQyYJqZTTWzCuBSMnPOe+s9B/1i4Bl3j9jvKilWX/nap6isLGNkVQXjxo/huBkHhR2SFCEjU+LI5SiUvEsc2Zry1cATZIbZLXT318zseqDZ3RcBdwC/MbM1ZBax1jxZCcxZs47hiKMmsn3bLo6YfiAVFZGq3EkRKckatLsvBhbv9drPez3uBC4Joi2RvjROqqNxUl3YYUixi1iC1lRvCc3zm/4fJz7wrxx97008+NbKsMMRKckatMh++eazD7Ots51diW5+9sKTvN+pRYgkRDnWnwtZBlGCltB0JBO7H5tBRyrRz9kiBaAetEjGD088ncpYnBHxMuZMnc6B1aPDDkmGuahN9dbtbgnNldNP4rMHHUFXKsnkGu1QIuEryVEcIvtrfHVN2CGIZBS4fJELJWiRIuXuPLJwKc8+upzpJ07lyms/R7nGgOdHCVpEgvDiU69x9y8fo7Ojm3VvbaZ69Agu/54W2NpfPTMJo0QJWqRItazdQiKRBKC7M8Ha1RtDjqj4WTpaGVqjOPrh7ty2+v8yZ8nt/OPLT5JIp8IOSWS3mWcfTUVlOSOqKqgcWc55l3087JCKWwQXS1IPuh+Pt6zm31b/Jx2pBGvbtlJXWcU3j9SGoRINjQd/jFsf/wErX3ybg488kEOmTww7pKKnEkcRWdu2ja5U5k/IzlSSN3ZsCTkikT2Na6zj7EatQRKYiCVolTj6cW7jkYwoK6eqrJwR8TK+ePDxYYckIkMoalO91YPux6Gj6/njOfNYvvU9pteOZ9oYbSIgUtIi1oNWgh5AY3UtjdWa5SZS8ryw07hzoQQtIoLGQYuIRFvEduJTghYRyVIPWkQkiiK4WJKG2cmQ2P7+h7y6aj3tHd1hhyKSM60HLSXvtdXrueYnDxKLGVUjK7h9/hXU1laFHZbIgKI2ikM9aAncv9//Ap2dCdrbu9nZ1sGz//F62CGJDMzJ3CTM5SiQvBK0mdWZ2RIzeyv7dew+zkuZ2cvZY1E+bUr0HVBXTVlZ5n+tWCxG7Rj1nqU4RG0mYb496B8DT7v7NODp7PO+dLj7jOxxQZ5tRlrrph3M/8c/cOsv/sgH23aFHU4orvr6GRx7VCOja0Yw66yjOf20w8MOSSQ3Jbaa3RzgjOzju4A/AT/K85pFK5VK893LF/D+1jYsZqx4/m1+/ci3ww6r4GpqRvCrGy4NOwyRQYniRJV8e9Dj3L1nlfBNwLh9nDfCzJrN7AUzuzDPNiNr5wft7PzgQ9JpJ5VM0/JuK8mE1pCOuh1tHexo6wg7DAmbO5bO7SiUAXvQZvYUML6Pt37a+4m7u9k+f/8c5O7rzexg4Bkze8Xd3+6jrXnAPIDJkycPGHzUjBlbxbgDx7Jp/fuYwcGHT6CsPB52WNKPux96kYW/fQ6AK79wKpdfdErIEUmoAsy9ZvYu0AakgKS7Nw32GgMmaHc/q58ANpvZBHffaGYTgD4XTHb39dmva83sT8DxwEcStLsvABYANDU1ReyPjYHFYjFu+s08Fv9uGWXxOOddMuh/Dymgrq4Etz/4HKlUZmzVrx94ji989kQqtfHqsDUEJY5Pu/vW/f3mfP9PXAR8Fbgh+/XRvU/Ijuxod/cuM6sHPgHcmGe7kVUzeiRf/Pqnwg5DchCLxYiZ0VOEihnEzEKNSULkQIntSXgDcLaZvQWclX2OmTWZ2e3Zc44Ems3sL8CzwA3uvirPdkXyVl4e59pvnkNFeZyK8jjXfvNcylWSGt6CHcXhwJNmtjxbvh20vHrQ7r4NOLOP15uBv80+fg44Jp92RIbKuZ+azjmfPBIAU+952BtEiaPezJp7PV+QLdH2dlr23tvHgCVm9rq7Lx1MPCq2ScGsaXuNd9rf5NBR05laHZ2x0UrM0mMQIzS2DnTTr9e9ty1m9jBwMqAELdGzaudL3PnOTSQ9QZmVc9Uh13LIqCPDDkvkrwKchGJm1UDM3duyj88Brh/sdZSgpSBWfvBnEp5Z2S7h3azauUIJWiIlM1ElsJuE44CHs3+dlQH3uvvjg72IErQUxMHVh/PSB8/Rne6i3Co5qGpa2CGJfFRAq9m5+1rguHyvowQtBXFS3ekkPckbbSs5ekwTx9aeHHZIRa9l+w4efGElB4yqYu6px1FRph/nfAXYgw6E/kWlIMyMU+vP4tT6fc57kkHY1dnFF26+l7bOLsrjMV5at4H/dfnnwg6ruEVwRxUlaJEitLb1fVLpNGl3upIpXljzXtghlYDCrrORCyVokSI0pb4WM8OAirI4J06dGHZIpUElDhHJ1+iRI7j/6rnc89xLHDCqiis+pXVf8ubR2/JKCVqkSE1pGMtP53wm7DBKi3rQIiIRFa38rAQtItLD0tGqcShBi4hAdrnRsIPYkxK0iAhguCaqiIhElhJ0afPkOvzDuyA2Fqu+EotVhR2SiORKCbp0eXoXvu1i8J1AOZ54Gau7I+ywRIrGO6taeOiWJYz92GjmXvNZRo4aUbjGVYMeGun0B3zY/lvMqqmuugSz8nACSa0js4GvA92QWBFOHCJFaOf2XVwz+xe0t3VSXlnGO6ta+IcHvlPQGDSKI2DuCTZtmUUqtQmzGB2dT9JwwJ3hBBOfApST2eqxHCpmhhOHSBFa//bm3Y8TXUlWL1tb4AhcJY6gJVPvkU63Al24Q2fnM6HFYrFqqH8Ib78PrA6r/lJosYgUm8mHH0h5RRmxshjl5XFOPvvYwgbgKEEHLR4bT6bXakCc8vJw97qz+ESs5vuhxiBSjKpHj2T+n/4bS+57jtr60Zz75U8UPohoVTiKP0HHYlWMa3iUHW03EbNRjBn947BDEpH91DCxjsu+f35o7UdtHHQsn282s0vM7DUzS5vZPpfTMrNZZvaGma0xs8AzaHn54dTX3Ubd2H8mHq8P+vIiMly453YUSF4JGngV+Dz9bCVuZnHgFmA2MB2Ya2bT82xXRCRY7pBK53YUSF4lDndfDZntjPpxMrAmu4kiZnY/MAdYlU/bIiKBK6USR44mAr3342nJviYiEi0RK3EM2IM2s6eA8X289VN3fzTIYMxsHjAPYPLkyUFeWkSkfw4U256E7p7vNszrgUm9njdmX+urrQXAAoCmpqZo/ZeSYaM9uYPHNtzItu73mFH7OU6uvyTskKQgHDxa4+wKUeJYBkwzs6lmVgFcCiwqQLsi++WpTf/Kug9fZmdiM89v/Xda2l8JOyQpBCdyNwnzHWZ3kZm1AB8H/mhmT2RfP9DMFgO4exK4GngCWA086O6v5Re2yNDZkdhEmuTu522JrSFGIwVVbDXo/rj7w8DDfby+ATiv1/PFwOJ82hIplFMOuJTFG24kZnEqYlVMHaUds4eNiI3iKPqZhCJBO2z0adRXTmFHYiMTRx5FRVxreg8PWixJpCjUVTZSV9kYdhhSSA5EbLnRQtwkFAmMu7P49qe48Wvz+fNjL4UdjpSaUqpBixTao/Mf4/Zr76WrvYulv32ef3rsZxzzySPDDktKghd0hEYu1IOWorLiqVfoau8CINmdYtXzb4YckZQMB/d0TkehKEFLUTn1wpOorKoEoKwizoxPHxVyRFJS0p7bUSAqcUhRmfW1zzCqtpo3lr3NzPNP5PCTDg07JCklGsUhkp/TLjqF0y46JewwpNS4R24UhxK0iEgP9aBFRKLI8VQq7CD2oAQtIgKRXG5UozhERHp4OrcjB0HsxaoetIgImQ60B9SD7rUX69lkdpFaZmaL3H1QW/2pBy0iAtlp3IH1oHfvxeru3UDPXqyDoh60iEhWgDcJ+9qLddBjQyOboJcvX77VzNb1eqkeGE4rp+vzlrbh9HkL8VkPyvcCbbz/xFP+u/ocTx9hZs29ni/IbtkXqMgmaHdv6P3czJrdfdisnK7PW9qG0+ctls/q7rMCvFzOe7H2RzVoEZHgBbIXa2R70CIixcrdk2bWsxdrHFi4P3uxFlOCDry+E3H6vKVtOH3e4fRZdwtiL1bziM09FxGRDNWgRUQiqqgStJn9TzN73cxWmtnDZlYbdkxDycwuMbPXzCxtZpG/C74/gpgOW0zMbKGZbTGzV8OOZaiZ2SQze9bMVmX/P/5O2DEVm6JK0MAS4Gh3PxZ4E7g25HiG2qvA54GlYQcyFHpNh50NTAfmmtn0cKMacncCQQ7nirIkcI27TwdmAt8aBv++gSqqBO3uT7p7Mvv0BTJjC0uWu6929zfCjmMIBTIdtpi4+1Jge9hxFIK7b3T3FdnHbcBqMjPsJEdFlaD38nXgsbCDkLz0NR1WP8AlyMymAMcDL4YbSXGJ3DA7M3sKGN/HWz9190ez5/yUzJ9P9xQytqGQy+cVKWZmNgr4PfBdd98ZdjzFJHIJ2t3P6u99M7sCOB8400tgjOBAn7fEBTIdVqLLzMrJJOd73P2hsOMpNkVV4jCzWcAPgQvcvT3seCRvgUyHlWgyMwPuAFa7+6/CjqcYFVWCBuYDNcASM3vZzG4LO6ChZGYXmVkL8HHgj2b2RNgxBSl7w7dnOuxq4MH9mQ5bTMzsPuB54HAzazGzK8OOaQh9Argc+Ez25/VlMzsv7KCKiWYSiohEVLH1oEVEhg0laBGRiFKCFhGJKCVoEZGIUoIWEYkoJWgRkYhSghYRiSglaBGRiPr/2NBuVzvBP+4AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 1.7576462e-01 -8.3499146e-01 -4.8558775e-01 -8.6679524e-01]\n",
      " [ 6.7074466e-01 -9.5658296e-01 -4.1928166e-01  1.9992038e+00]\n",
      " [-1.3715661e-03 -8.7452549e-01 -1.2417628e+00 -2.7125680e-01]\n",
      " [ 1.8180997e+00 -2.8713477e-01  6.0172373e-01 -1.6612873e+00]\n",
      " [ 7.9852432e-02  3.1464949e-01 -7.9826778e-01 -4.5102075e-01]\n",
      " [ 1.1994725e+00  3.8611752e-01  2.5162503e-01  3.0731814e+00]\n",
      " [ 1.3417856e+00  2.9944196e-01  9.3829495e-01  1.4390557e-01]]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 4.98099178e-01 -8.27342644e-02  7.78911188e-02 -1.23847961e+00\n",
      "  -3.23539555e-01 -3.03213835e-01  4.31814164e-01  3.73259723e-01]\n",
      " [-1.54094100e-01 -4.99103755e-01 -8.05141151e-01 -1.48511577e+00\n",
      "   4.61736083e-01  4.64351207e-01 -5.61365008e-01 -2.45635569e-01]\n",
      " [ 1.85655892e+00 -7.23395824e-01  1.33354199e+00 -9.83140051e-01\n",
      "   5.02367914e-01  9.23127949e-01 -2.39101902e-01  1.56915915e+00]\n",
      " [-2.21975207e+00  2.00389600e+00 -8.92360687e-01 -4.34906036e-01\n",
      "   7.01867878e-01 -3.20120335e-01 -9.83829856e-01 -5.09545624e-01]\n",
      " [-4.81808543e-01 -1.36400771e+00  6.13824844e-01  1.29532754e+00\n",
      "   5.36526889e-02  3.03354263e-01  1.07620418e+00  4.54741299e-01]\n",
      " [-6.97803140e-01 -4.90285754e-01 -3.72919589e-01  9.49328125e-01\n",
      "  -8.62066507e-01 -1.72324133e+00  9.17931378e-01  2.76088148e-01]\n",
      " [-1.38418829e+00  1.93493557e+00 -1.00864732e+00 -1.83287489e+00\n",
      "   6.12823009e-01 -1.53099775e-01 -1.63114637e-01  6.17018342e-01]\n",
      " [-9.11386371e-01 -2.04190299e-01  8.71019483e-01 -1.76692462e+00\n",
      "  -4.66835022e-01 -1.45824075e+00  1.82506311e+00  3.90609294e-01]\n",
      " [-1.59392565e-01 -1.23346138e+00 -1.90532863e+00 -6.52276099e-01\n",
      "  -1.61005366e+00 -5.54627515e-02 -9.51771021e-01  2.78397202e-01]\n",
      " [-1.05615509e+00 -6.37096763e-01  3.27081233e-01 -9.09156501e-01\n",
      "   5.31119108e-01  1.68163323e+00 -1.22661877e+00 -1.16946101e+00]\n",
      " [ 1.96395206e+00  1.16807330e+00 -9.08478558e-01  1.30136395e+00\n",
      "  -7.15143681e-01  1.37303710e+00  5.87780654e-01 -7.04216897e-01]\n",
      " [-2.41409048e-01 -1.57751083e+00  9.67348695e-01  8.12331438e-01\n",
      "  -6.54978335e-01 -2.36340433e-01 -8.06822002e-01  6.14637434e-01]\n",
      " [ 2.98586458e-01 -1.27989125e+00 -3.03045869e-01  1.26735914e+00\n",
      "   2.99607486e-01  1.81834519e-01 -1.13222408e+00  1.90763605e+00]\n",
      " [-8.30008745e-01 -3.14347774e-01 -6.86081201e-02 -1.92573476e+00\n",
      "   4.46795344e-01  2.25458908e+00 -8.00860703e-01  4.96359123e-03]\n",
      " [ 2.10521436e+00 -7.50352144e-01 -1.60306036e+00  1.24167299e+00\n",
      "  -1.53201473e+00 -6.07976675e-01  4.03889894e-01  3.10559893e+00]\n",
      " [-6.68026149e-01 -4.25588906e-01  2.19232678e+00  9.43919837e-01\n",
      "   1.71120012e+00 -6.23420179e-01 -2.69760579e-01 -6.23897374e-01]\n",
      " [ 9.44823503e-01 -6.29370153e-01  5.66799283e-01  4.95043963e-01\n",
      "   1.25080526e+00  8.31067801e-01 -2.19560766e+00  9.52309132e-01]\n",
      " [-2.65445769e-01 -1.45208204e+00  3.39253306e-01 -4.62719589e-01\n",
      "   5.82294464e-02 -5.87680638e-01  1.36966005e-01  5.63676834e-01]\n",
      " [-1.26080084e+00  1.77228248e+00  1.90803373e+00 -6.13361478e-01\n",
      "  -1.87007773e+00 -9.84870434e-01  3.14202994e-01  1.26938984e-01]\n",
      " [-3.61357629e-01 -6.04966223e-01 -1.04245174e+00 -1.20026124e+00\n",
      "   1.54595685e+00 -8.29946160e-01 -2.23116726e-01  7.59910941e-01]\n",
      " [ 3.66836131e-01 -8.98558617e-01  2.15591574e+00 -3.74712646e-01\n",
      "   1.36632383e-01 -1.04471242e+00 -1.80073813e-01  5.46929717e-01]\n",
      " [ 8.06585252e-01 -1.61902833e+00 -8.50444257e-01  2.24079871e+00\n",
      "  -6.20221138e-01  1.22018957e+00 -4.95566249e-01 -1.69869912e+00]\n",
      " [ 1.07389653e+00  1.17748332e+00  7.04154909e-01  8.21960926e-01\n",
      "  -1.82925612e-02 -2.02107779e-03 -6.62737489e-01  2.43501687e+00]\n",
      " [ 1.32811832e+00  1.07117927e+00  7.47461796e-01 -1.25909734e+00\n",
      "  -5.12236178e-01  1.15307009e+00  2.95723289e-01  8.97853434e-01]\n",
      " [ 2.05640227e-01 -3.81385162e-02  4.89029884e-01  2.31880099e-01\n",
      "   2.07792497e+00 -4.13341522e-01  7.17833281e-01 -4.49613243e-01]\n",
      " [ 1.04648840e+00 -1.63684046e+00  2.00579476e+00 -4.05959249e-01\n",
      "   1.55355245e-01 -1.93912033e-02  1.29571867e+00  1.26952910e+00]\n",
      " [-6.38735116e-01  1.80019462e+00  5.08131199e-02 -5.95562458e-01\n",
      "   1.23391196e-01 -1.93967775e-01 -2.71696746e-01 -8.00848961e-01]\n",
      " [ 9.86396730e-01 -1.72690585e-01  1.09916794e+00  7.38573134e-01\n",
      "   1.05788195e+00 -9.17866006e-02  1.53963006e+00 -5.18583894e-01]\n",
      " [-8.59367251e-01  6.12295389e-01 -7.07566440e-02 -9.53186080e-02\n",
      "   2.71854568e+00 -3.61808717e-01 -6.54270768e-01  2.65192926e-01]\n",
      " [-1.20370770e+00 -2.42622197e-01 -2.13461593e-01  1.48284531e+00\n",
      "   1.34828770e+00 -1.88893080e+00 -2.52776206e-01 -1.87425494e-01]\n",
      " [ 4.89972532e-01  6.29054606e-01  5.09275794e-01  1.43639922e+00\n",
      "  -9.70800579e-01 -5.74341714e-01 -5.51029563e-01  7.13543594e-01]\n",
      " [-1.08354434e-01 -3.69328111e-01  1.23426628e+00 -1.56932020e+00\n",
      "  -9.50776398e-01  1.13925028e+00  9.86307338e-02  1.59988880e-01]\n",
      " [ 1.19575504e-02  1.64286339e+00  8.71572793e-01 -5.28559268e-01\n",
      "   1.67933011e+00 -1.03319757e-01 -2.41277844e-01 -2.75491804e-01]\n",
      " [ 5.06841421e-01 -1.06749415e+00  8.85095835e-01  9.27566707e-01\n",
      "  -8.98645520e-01 -1.53808558e+00 -9.89049554e-01 -9.78061795e-01]\n",
      " [ 4.93730247e-01 -1.73913133e+00 -8.82505178e-02  1.05697036e+00\n",
      "   7.40441442e-01 -1.70263672e+00 -1.00089180e+00  7.01057136e-01]\n",
      " [-8.90020251e-01 -1.76678732e-01 -6.04684465e-02  9.89034116e-01\n",
      "   9.78185654e-01  7.33551621e-01  8.88141930e-01 -1.16876185e+00]\n",
      " [ 7.06959307e-01  2.16585708e+00  1.36210775e+00 -8.63535225e-01\n",
      "  -5.28709590e-01  4.78126615e-01  1.82389393e-02  4.98700514e-03]\n",
      " [-2.08262905e-01 -1.57761171e-01  9.21060801e-01 -1.17248547e+00\n",
      "   5.02152741e-03 -1.19561708e+00 -1.61238062e+00  3.83235902e-01]\n",
      " [ 1.92053485e+00 -2.88480893e-02  4.45840597e-01  4.99741048e-01\n",
      "  -1.35293233e+00 -1.29994619e+00  1.03346169e+00 -1.55553043e+00]\n",
      " [ 7.08238065e-01  1.08747017e+00 -5.94205149e-02  4.39567238e-01\n",
      "   4.36069101e-01  2.23112321e+00 -1.83913857e-01  1.89614683e-01]\n",
      " [ 6.67632043e-01 -2.14909509e-01  7.47380793e-01 -2.60721475e-01\n",
      "  -1.03169322e+00  1.02145404e-01  3.60869050e-01  2.40775421e-01]\n",
      " [-4.37188268e-01  5.13818443e-01  1.43967897e-01 -2.06991255e-01\n",
      "   6.43229187e-01  7.76386738e-01 -1.56987572e+00  9.79186654e-01]\n",
      " [ 2.44847331e-02  1.20094188e-01  1.48904873e-02  1.11514246e+00\n",
      "   6.38649702e-01 -1.60499454e+00 -1.93743616e-01  8.07734251e-01]\n",
      " [ 1.08833313e+00  1.40995598e+00 -2.29126364e-01  1.24876618e+00\n",
      "   8.91067266e-01 -1.53287506e+00  4.94632572e-01 -8.83727849e-01]\n",
      " [ 9.88562346e-01  9.92475748e-01 -1.36613727e-01 -1.09039271e+00\n",
      "   5.22122204e-01  4.38231498e-01  1.42605090e+00  4.16358620e-01]\n",
      " [-1.28161001e+00  2.94193029e-01  4.17322308e-01 -1.09934258e+00\n",
      "   6.95449650e-01  6.73298001e-01 -7.75697708e-01 -7.63395131e-01]\n",
      " [ 9.40180361e-01 -2.77778238e-01 -3.55366856e-01 -2.08842850e+00\n",
      "   1.43286967e+00 -8.06313992e-01 -8.84459674e-01 -2.06623292e+00]\n",
      " [ 1.49553096e+00  8.04835379e-01  1.16103148e+00  2.93149889e-01\n",
      "   1.74147809e+00 -5.52271605e-01  3.26810867e-01 -1.16794944e+00]\n",
      " [ 1.10033429e+00 -6.91018522e-01 -9.23770905e-01  2.85468549e-01\n",
      "   7.89962038e-02  1.82335615e-01 -1.67359188e-01 -3.60586941e-01]\n",
      " [-1.85062790e+00  7.50245869e-01  4.25948739e-01 -2.09324375e-01\n",
      "   1.07170308e+00  1.34734511e+00  3.44885923e-02  2.41901249e-01]\n",
      " [-3.51436257e-01  1.76677451e-01  2.41490793e+00 -6.42260849e-01\n",
      "  -4.42510009e-01  3.87410760e-01  1.84379950e-01 -7.34142721e-01]\n",
      " [ 1.15678632e+00 -1.27643073e+00 -3.70706022e-01  1.05444483e-01\n",
      "  -5.32851100e-01 -1.43010008e+00 -8.60235095e-01 -3.93850505e-01]\n",
      " [-1.24991882e+00 -1.46045315e+00  1.66758442e+00  1.13357210e+00\n",
      "  -9.72968519e-01 -1.28258631e-01  6.70203030e-01  2.73328453e-01]\n",
      " [-5.90616882e-01 -9.79090571e-01 -4.50562030e-01 -1.02860665e+00\n",
      "   1.31994918e-01 -1.95682609e+00  3.96070212e-01  1.86740148e+00]\n",
      " [-7.71736026e-01  5.73203444e-01 -8.71858150e-02  1.53586435e+00\n",
      "  -1.78401673e+00  5.00856817e-01  9.42064881e-01 -2.30445310e-01]\n",
      " [-3.79158556e-01  5.48246324e-01 -4.37077671e-01 -6.69085622e-01\n",
      "  -1.19249249e+00 -4.67833012e-01  5.33117652e-01  4.37152952e-01]\n",
      " [-8.76463711e-01  1.52797246e+00 -2.21686482e+00 -1.18536258e+00\n",
      "  -9.02159631e-01 -3.53385597e-01 -1.80487597e+00  5.59424818e-01]\n",
      " [-2.32846648e-01 -7.79795274e-02  2.27699113e+00 -1.03820455e+00\n",
      "   8.61408770e-01 -1.27493358e+00 -7.34559357e-01  8.50952804e-01]\n",
      " [-2.44939113e+00  5.87781310e-01  3.57339442e-01 -1.45098484e+00\n",
      "   6.06700480e-01 -1.12183464e+00  2.04590946e-01  1.93619847e+00]\n",
      " [-3.22269320e+00 -1.65522671e+00  5.03517509e-01  6.27494693e-01\n",
      "  -1.91491842e+00  1.63004529e+00  1.15703642e+00  1.24851778e-01]\n",
      " [-4.65091795e-01 -1.43914104e+00  1.03695345e+00 -3.72096151e-01\n",
      "  -1.68050599e+00 -3.85962516e-01 -3.00161451e-01  1.54185331e+00]\n",
      " [-6.52996838e-01 -1.57062566e+00 -6.12557828e-01  6.63709164e-01\n",
      "  -5.92644930e-01 -5.57946205e-01 -8.14211071e-01  5.41654766e-01]\n",
      " [ 1.46658123e-01 -7.37621188e-01  1.75739121e+00  3.50243539e-01\n",
      "   2.02517247e+00  2.33156696e-01  1.30058587e+00 -1.35908604e+00]\n",
      " [ 8.81036103e-01 -1.43510317e-02  1.47009075e+00 -1.34377086e+00\n",
      "   3.02608430e-01  1.30900335e+00 -1.78232923e-01  1.44479954e+00]\n",
      " [-1.22337842e+00 -2.99644202e-01  3.05041224e-01 -4.30219591e-01\n",
      "  -8.91315460e-01 -1.02840848e-01 -8.84835839e-01  2.18664870e-01]\n",
      " [-3.19721341e-01  1.80654123e-01 -9.35883727e-03 -4.44185108e-01\n",
      "   5.99536836e-01 -5.76824784e-01  1.34955406e+00  1.06108427e+00]\n",
      " [-5.72030783e-01 -4.82075959e-01 -2.86735803e-01  6.39763623e-02\n",
      "   8.20405304e-01  5.87227009e-03  1.79220521e+00 -3.85825068e-01]\n",
      " [-1.74176764e+00  1.38568664e+00  1.98134169e-01 -9.96647358e-01\n",
      "   1.25624883e+00  5.54650784e-01 -1.24917686e+00  4.83565420e-01]\n",
      " [-4.15149122e-01  1.34336725e-01  1.34846663e+00  1.06911922e+00\n",
      "   1.37673914e+00 -2.26346329e-01  1.71113431e+00 -1.11225414e+00]\n",
      " [-1.44644082e+00 -1.62642634e+00 -1.27954936e+00  7.10029781e-01\n",
      "  -1.08793688e+00 -2.48588637e-01 -1.03906073e-01  7.02441037e-01]\n",
      " [-1.65071023e+00 -4.86679301e-02 -1.94071576e-01  3.54863226e-01\n",
      "   2.73493004e+00  5.73009513e-02  1.98031056e+00  1.02811420e+00]\n",
      " [-2.85850704e-01  9.34709370e-01  8.55460465e-01 -1.27595589e-01\n",
      "   1.07991445e+00  2.19854736e+00 -4.24755812e-01  1.77864468e+00]\n",
      " [-1.70255518e+00  5.79962611e-01 -1.12842047e+00 -4.23602998e-01\n",
      "   4.06675190e-01 -1.99752554e-01  1.70835078e+00 -3.63107994e-02]\n",
      " [-1.70069009e-01 -3.69471461e-01 -6.99770808e-01  1.22293198e+00\n",
      "   9.72163305e-02  1.95671082e-01  3.09936434e-01 -1.14115977e+00]\n",
      " [ 6.48109376e-01  7.64332771e-01 -3.08804542e-01  1.68016517e+00\n",
      "   5.32377362e-01  7.46934235e-01 -1.60863304e+00  8.16354096e-01]\n",
      " [-6.16717756e-01 -3.78373384e-01 -8.19357455e-01  1.08335674e+00\n",
      "   4.97420579e-01 -3.62237573e-01 -1.17969763e+00  9.04969275e-01]\n",
      " [ 1.22875333e+00 -3.83405298e-01 -5.12794256e-01  5.67542434e-01\n",
      "   3.55022162e-01  4.69358623e-01  2.42423606e+00 -1.23112977e-01]\n",
      " [-3.97227973e-01 -8.16268086e-01  2.39312828e-01  4.23896700e-01\n",
      "  -2.05084372e+00 -2.42340893e-01  6.92291021e-01  1.04937524e-01]\n",
      " [-4.39863384e-01  3.95488024e-01  1.98597729e-01 -8.56955349e-01\n",
      "   1.29790187e+00  1.08416653e+00 -1.23496401e+00 -8.36271167e-01]\n",
      " [-3.98047984e-01 -1.45489347e+00 -1.47542465e+00 -1.32130778e+00\n",
      "   6.48823917e-01 -1.71875787e+00  1.05278623e+00  4.69512552e-01]\n",
      " [ 6.36580110e-01 -5.80701292e-01  1.31767142e+00  2.17391476e-01\n",
      "  -5.62541485e-01 -1.33181107e+00  1.46103632e+00  3.60927671e-01]\n",
      " [ 6.15922093e-01 -9.11396265e-01 -2.14985281e-01 -3.60977530e-01\n",
      "  -5.70370972e-01  4.15763259e-01 -2.20988587e-01 -3.95223469e-01]\n",
      " [ 2.06061888e+00  7.13540554e-01 -3.35455805e-01 -2.86877573e-01\n",
      "   7.69905448e-01 -1.37179345e-01 -1.11137247e+00  3.31267953e-01]\n",
      " [-2.11823747e-01  1.55605406e-01  1.18950641e+00 -8.24072659e-01\n",
      "  -1.29777884e+00 -1.05332553e+00 -1.09461308e+00  6.30940080e-01]\n",
      " [ 6.99995875e-01  1.54036903e+00  6.01564825e-01 -1.68967175e+00\n",
      "   3.15686613e-01 -1.82074830e-01 -1.17611788e-01 -2.52329373e+00]\n",
      " [ 1.40321124e+00 -1.08235061e-01  1.01050246e+00  2.90478975e-01\n",
      "   5.20220660e-02 -1.33679688e+00  6.91229939e-01  6.97755396e-01]\n",
      " [-1.18446028e+00 -6.07529759e-01 -2.36689165e-01 -1.92372298e+00\n",
      "   9.15334702e-01  7.75990307e-01  1.22327387e+00 -2.04444313e+00]\n",
      " [-6.15460217e-01 -1.32355285e+00 -4.75059062e-01  3.06423098e-01\n",
      "   1.36237097e+00 -1.41414475e+00  3.70344579e-01  1.09988439e+00]\n",
      " [-1.96138108e+00 -4.65645492e-01 -4.22412157e-01 -8.99542153e-01\n",
      "  -8.69974315e-01 -1.31682098e+00 -1.24109662e+00 -2.21792078e+00]\n",
      " [ 8.82168651e-01 -1.96329609e-01  5.52806199e-01  3.65213484e-01\n",
      "  -1.40415931e+00 -2.42244020e-01 -1.24605703e+00  6.15358770e-01]\n",
      " [ 5.18548131e-01 -3.84118259e-01 -9.90973055e-01 -1.16502881e-01\n",
      "  -6.14821851e-01  3.70729566e-01  3.48025084e-01  4.05496866e-01]\n",
      " [ 2.53068417e-01 -7.80153215e-01  1.33604777e+00 -2.55086333e-01\n",
      "   2.12629914e+00 -6.57590568e-01 -1.60805702e+00 -1.09783113e+00]\n",
      " [-1.18863058e+00  6.38405159e-02  1.23315060e+00  8.66220593e-01\n",
      "  -7.26043358e-02  9.21093404e-01  4.24238108e-02  7.29019880e-01]\n",
      " [-1.40768364e-01  9.06382382e-01 -2.10455561e+00  1.55504894e+00\n",
      "   8.17087471e-01  8.49800527e-01 -1.86299637e-01 -1.00085592e+00]\n",
      " [-5.69424592e-02 -1.10986494e-01  7.71130502e-01 -1.13564432e+00\n",
      "   3.31070840e-01 -6.75034150e-02 -1.18180001e+00 -2.58969218e-01]\n",
      " [-3.81045669e-01 -7.68502951e-01  7.54048228e-01  2.79092163e-01\n",
      "  -1.19847274e+00  2.51022339e-01 -1.73231685e+00 -8.68305743e-01]\n",
      " [-4.87641096e-01 -2.17564058e+00 -1.96247801e-01  1.03735960e+00\n",
      "  -1.98329520e+00  9.05011147e-02  2.84229159e-01  2.57468432e-01]\n",
      " [ 1.26000714e+00  1.38050810e-01  8.51838291e-01  3.26340258e-01\n",
      "   1.07970595e+00  2.25534391e+00  1.74559787e-01  2.84989774e-01]\n",
      " [-9.78225246e-02 -6.82057798e-01  1.50839841e+00 -9.71712589e-01\n",
      "  -1.43843412e+00 -4.06757474e-01  5.68345904e-01  7.71512091e-01]\n",
      " [ 8.79438892e-02  1.30658269e+00 -1.22470832e+00  4.12592053e-01\n",
      "  -1.38122189e+00 -4.31529701e-01 -4.04100604e-02 -1.10036337e+00]]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "drawTSNE(range(24), range(24), cancelProbModel.houremb)\n",
    "drawTSNE(range(7), range(7), cancelProbModel.weekemb)\n",
    "drawTSNE(range(len(hex_grid_data['ID'])), range(len(hex_grid_data['ID'])), cancelProbModel.GIDemb)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "metadata": {},
   "outputs": [],
   "source": [
    "class TestModel(nn.Module):\n",
    "    def __init__(self, weekfeat = 4):\n",
    "        super(TestModel, self).__init__()\n",
    "        self.weekemb = nn.Embedding(7, weekfeat)\n",
    "        self.fc = nn.Linear(4,1)\n",
    "        \n",
    "    def forward(self, week):\n",
    "        week = self.weekemb(week)\n",
    "        \n",
    "        return self.fc(week)\n",
    "testModel = cuda(TestModel())\n",
    "opt = torch.optim.Adam(testModel.parameters(), 0.01)\n",
    "loss = nn.MSELoss()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 tensor([ 0.0736,  0.0736,  0.3059,  ...,  0.3059,  0.8500, -0.0915],\n",
      "       device='cuda:0', grad_fn=<SqueezeBackward0>)\n",
      "100 tensor([-1.6564e-03,  9.1937e-04,  5.6413e-04,  ..., -1.6564e-03,\n",
      "         1.0002e+00,  1.0002e+00], device='cuda:0', grad_fn=<SqueezeBackward0>)\n",
      "200 tensor([ 1.4156e-05,  1.4156e-05,  1.9848e-05,  ..., -2.3544e-06,\n",
      "         9.9996e-01,  1.4156e-05], device='cuda:0', grad_fn=<SqueezeBackward0>)\n",
      "300 tensor([ 8.9407e-08,  1.1921e-07,  2.0862e-07,  ..., -2.9802e-08,\n",
      "         1.0000e+00,  2.0862e-07], device='cuda:0', grad_fn=<SqueezeBackward0>)\n",
      "400 tensor([ 1.0000e+00,  0.0000e+00,  1.0000e+00,  ..., -2.9802e-08,\n",
      "         5.9605e-08,  0.0000e+00], device='cuda:0', grad_fn=<SqueezeBackward0>)\n",
      "500 tensor([1.0000e+00, 0.0000e+00, 2.9802e-08,  ..., 1.0000e+00, 1.0000e+00,\n",
      "        1.0000e+00], device='cuda:0', grad_fn=<SqueezeBackward0>)\n",
      "600 tensor([ 1.0000e+00, -2.9802e-08, -2.9802e-08,  ...,  0.0000e+00,\n",
      "         2.9802e-08,  0.0000e+00], device='cuda:0', grad_fn=<SqueezeBackward0>)\n",
      "700 tensor([-2.9802e-08, -2.9802e-08, -2.9802e-08,  ...,  8.9407e-08,\n",
      "         1.0000e+00,  2.9802e-08], device='cuda:0', grad_fn=<SqueezeBackward0>)\n",
      "800 tensor([ 0.0000e+00, -2.9802e-08,  1.0000e+00,  ...,  1.0000e+00,\n",
      "         1.0000e+00, -2.9802e-08], device='cuda:0', grad_fn=<SqueezeBackward0>)\n",
      "900 tensor([-5.9605e-08,  0.0000e+00,  0.0000e+00,  ...,  0.0000e+00,\n",
      "         1.0000e+00,  2.9802e-08], device='cuda:0', grad_fn=<SqueezeBackward0>)\n"
     ]
    }
   ],
   "source": [
    "bs = 4096\n",
    "for i in range(1000):\n",
    "    a = np.random.randint(0,6,bs)\n",
    "    b = a >= 4\n",
    "    a = torch.tensor(a).cuda()\n",
    "    b = torch.tensor(b).float().cuda()#.unsqueeze(1).repeat(1,4)\n",
    "    testModel.train()\n",
    "    opt.zero_grad()\n",
    "    res = testModel(a).squeeze()\n",
    "    l = loss(res, b)\n",
    "    l.backward()\n",
    "    opt.step()\n",
    "    if i % 100 == 0:\n",
    "        print(i, res)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 3, 1, 1, 2, 0, 1, 5, 3, 4])"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.random.randint(0,6,10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'epoch': 999,\n",
       " 'iteration': 50,\n",
       " 'loss': 0.0034723819699138403,\n",
       " 'model': None,\n",
       " 'opt': None}"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "best_result['model'] = best_result['opt'] = None\n",
    "best_result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 [tensor([6972, 5522]), tensor([3, 1]), tensor([1, 4]), tensor([False, False]), tensor([-0.0953, -0.0953]), tensor([-0.2789, -0.2789])]\n",
      "1 [tensor([7404, 5468]), tensor([ 8, 11]), tensor([3, 4]), tensor([False, False]), tensor([-0.0953,  0.6961]), tensor([-0.2789,  3.4602])]\n"
     ]
    }
   ],
   "source": [
    "count = 0\n",
    "for i in gridTrainDataLoader:\n",
    "    print(count, i)\n",
    "    count += 1\n",
    "    if i[3].sum() + i[4].sum() > 0: break"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1431192\n"
     ]
    }
   ],
   "source": [
    "count = 0\n",
    "for i in range((grid_order_reward_all_data['GID'].reshape(-1).shape[0])):\n",
    "    if grid_order_reward_all_data['reward'].reshape(-1)[i] != 0:\n",
    "        #print(grid_order_reward_all_data['hour'][i], grid_order_reward_all_data['weekday'][i])\n",
    "        count += 1\n",
    "print(count)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-0.27888531, -0.27888531, -0.27888531, ..., -0.27888531,\n",
       "       -0.27888531, -0.27888531])"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "grid_order_reward_all_data['reward']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "ename": "IndexError",
     "evalue": "invalid index to scalar variable.",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m-------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mIndexError\u001b[0m                  Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-18-ec89dfaef46b>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      2\u001b[0m     \u001b[0;32mfor\u001b[0m \u001b[0mj\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m24\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      3\u001b[0m         \u001b[0;32mfor\u001b[0m \u001b[0mk\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m7\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m             \u001b[0;32mif\u001b[0m \u001b[0mgrid_order_reward_all_data\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'reward'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mj\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      5\u001b[0m                 \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mj\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mIndexError\u001b[0m: invalid index to scalar variable."
     ]
    }
   ],
   "source": [
    "for i in range(8519):\n",
    "    for j in range(24):\n",
    "        for k in range(7):\n",
    "            if grid_order_reward_all_data['reward'][i][j][k] != 0:\n",
    "                print(i,j,k)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([30])"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "torch.cat((torch.zeros(10),torch.zeros(10),torch.zeros(10)), ).shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'ETA': array([ 8.68988024e-01,  1.47504310e+00,  1.59265635e-01,  9.54703646e-02,\n",
       "        -9.45987432e-01, -6.72075760e-02,  1.33747527e-01,  1.94353034e-01,\n",
       "         4.83026635e-01, -4.32435502e-01,  2.62932951e-01,  1.03444773e-01,\n",
       "        -3.54286295e-01, -4.14891802e-01,  8.59010740e-02,  6.23376231e-01,\n",
       "        -6.81237058e-01, -4.56358728e-01, -9.50772077e-01,  2.54958542e-01,\n",
       "        -1.05603427e+00,  1.67280844e+00, -4.30840620e-01,  5.54796315e-01,\n",
       "         5.08544743e-01, -1.10228585e+00, -8.48699644e-01,  8.24331334e-01,\n",
       "        -3.27173305e-01, -6.87616585e-01, -1.19957363e+00,  8.03597871e-01,\n",
       "        -3.68640231e-01,  8.96101014e-01,  1.00136321e+00, -1.29407965e-01,\n",
       "         1.76809335e-01, -8.94951215e-01, -7.83309491e-01,  1.17798709e-01,\n",
       "         1.62974663e+00, -8.88571688e-01,  6.80791975e-01, -8.82192161e-01,\n",
       "         4.75052226e-01, -8.99735861e-01, -7.83309491e-01, -1.19838674e-01,\n",
       "         1.70429808e-01,  2.61059892e+00,  5.75529778e-01, -1.10547561e+00,\n",
       "        -9.87454358e-01, -1.22668662e+00, -1.31600000e+00,  1.62455399e-01,\n",
       "        -1.49462676e+00,  3.78124214e+00, -1.16448623e+00, -1.44678031e+00,\n",
       "        -3.38337477e-01,  5.34062852e-01,  9.67870693e-01, -4.38815029e-01,\n",
       "        -6.52529186e-01, -1.26974843e+00, -5.69595334e-01,  9.04075423e-01,\n",
       "        -2.20316226e-01, -3.38337477e-01, -1.13867140e-02, -5.55241398e-01,\n",
       "         1.05039655e-01, -7.99258309e-01,  6.90361265e-01, -9.01330742e-01,\n",
       "        -6.30200841e-01, -1.19957363e+00, -8.83787043e-01, -3.54286295e-01,\n",
       "        -1.19478899e+00,  1.08429706e+00, -5.07394945e-01,  1.89609188e+00,\n",
       "         1.00614786e+00,  1.27368000e-01, -3.36742595e-01,  8.59418733e-01,\n",
       "         8.43061922e-02, -2.37859926e-01, -9.59154479e-02, -9.47582314e-01,\n",
       "        -8.53484289e-01, -1.21433556e-01,  2.99615231e-01, -7.76929964e-01,\n",
       "        -5.08989827e-01,  3.71384911e-01, -3.98942984e-01, -3.89373694e-01,\n",
       "        -1.40371850e+00, -1.43761901e-01,  7.54156536e-01,  1.56914112e+00,\n",
       "        -3.71829994e-01,  2.84345166e+00,  2.91522134e+00,  9.48732112e-01,\n",
       "        -1.16289135e+00, -8.51889407e-01,  2.53563947e+00,  2.53363660e-01,\n",
       "         1.05877895e+00, -5.90328797e-01, -8.40725235e-01, -1.93203236e-01,\n",
       "         3.79359320e-01,  3.95308138e-01,  6.10617177e-01,  1.22624154e+00,\n",
       "        -4.38815029e-01,  1.27408799e+00, -1.86823709e-01,  6.36135285e-01,\n",
       "        -5.29723290e-01,  3.52246330e-01, -8.59863816e-01, -1.30005119e+00,\n",
       "         4.33585300e-01,  6.35727292e-02,  6.07427413e-01,  9.64680930e-01,\n",
       "         3.45866803e-01, -9.47582314e-01,  6.82386856e-01, -8.00853191e-01,\n",
       "         3.33148548e+00, -2.28290635e-01, -7.75335082e-01,  1.05877895e+00,\n",
       "         3.61815620e-01,  3.66600266e-01,  1.37234013e-03,  8.70582905e-01,\n",
       "        -1.12142443e+00,  1.35342409e-01, -1.26496379e+00,  1.11459982e+00,\n",
       "        -1.18681458e+00, -8.40725235e-01,  2.08706970e-01,  2.89289299e+00,\n",
       "        -9.33228378e-01, -6.92401230e-01, -1.13099372e+00,  5.88288832e-01,\n",
       "         1.32831397e+00,  2.05717494e+00, -7.62576028e-01, -3.59070940e-01,\n",
       "        -1.13418348e+00, -1.30164607e+00, -1.24423032e+00,  4.65482936e-01,\n",
       "        -9.11308026e-02, -9.49177196e-01, -7.35463038e-01,  1.13852304e+00,\n",
       "        -1.74064655e-01, -8.63053580e-01, -8.74217752e-01,  1.81593980e-01]),\n",
       " 'GID': array([[0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0],\n",
       "        [0, 0]]),\n",
       " 'prob': array([[0.008606, 0.008098, 0.008355, ..., 0.042079, 0.043802, 0.046584],\n",
       "        [0.117864, 0.126627, 0.134129, ..., 0.210413, 0.227839, 0.237643],\n",
       "        [0.011333, 0.010759, 0.011035, ..., 0.041103, 0.044903, 0.050505],\n",
       "        ...,\n",
       "        [0.007798, 0.00699 , 0.006842, ..., 0.032306, 0.036269, 0.047186],\n",
       "        [0.008282, 0.008054, 0.008328, ..., 0.033484, 0.038825, 0.046666],\n",
       "        [0.162728, 0.210727, 0.236505, ..., 0.392457, 0.521975, 0.634254]]),\n",
       " 'reward': array([-1.29065207e-01,  3.26571739e+00,  4.82494894e-01,  1.53833343e-01,\n",
       "        -6.57419852e-01, -3.49559665e-01,  4.65853803e-01,  4.36731893e-01,\n",
       "         3.16083982e-01, -6.15817124e-01,  5.07456530e-01, -8.41729612e-03,\n",
       "         5.74020895e-01, -6.28297943e-01, -4.74367849e-01, -3.49559665e-01,\n",
       "        -7.15663671e-01, -5.82534942e-01, -8.57112946e-01,  2.28718253e-01,\n",
       "        -8.44632128e-01,  8.36118081e-01, -2.62193937e-01, -2.41392573e-01,\n",
       "         1.53920418e+00, -8.23830764e-01, -5.40932214e-01,  5.61540077e-01,\n",
       "        -7.82228036e-01, -1.41546026e-01, -7.03182853e-01,  4.86655166e-01,\n",
       "         4.70014075e-01,  1.65443406e-02,  9.90048175e-01, -2.99636392e-01,\n",
       "        -6.28297943e-01, -6.36618488e-01, -8.15510218e-01, -3.87002120e-01,\n",
       "         6.82187988e-01, -7.94708854e-01, -4.25702333e-03, -7.82228036e-01,\n",
       "         1.49760146e+00, -5.24291123e-01, -7.98869127e-01, -1.78988481e-01,\n",
       "         3.66007255e-01,  6.48905805e-01,  5.74020895e-01, -6.82381489e-01,\n",
       "        -7.15663671e-01, -7.57266399e-01, -8.48792401e-01, -3.07956937e-01,\n",
       "        -8.44632128e-01,  3.63598167e+00, -8.65433492e-01, -8.73754037e-01,\n",
       "         2.49519617e-01, -2.50583873e-02,  6.03142805e-01, -5.65893851e-01,\n",
       "        -8.03029400e-01, -8.15510218e-01, -6.32458215e-01,  1.39775491e+00,\n",
       "        -3.37078847e-01, -7.11503398e-01, -1.99789845e-01, -8.36311582e-01,\n",
       "         5.07456530e-01, -7.73907490e-01,  6.90508533e-01, -8.36311582e-01,\n",
       "        -2.37232300e-01, -8.40471855e-01, -8.07189673e-01, -7.11503398e-01,\n",
       "        -8.48792401e-01,  8.02835899e-01, -4.70207576e-01,  3.15755030e+00,\n",
       "         1.30622891e+00,  2.57840163e-01, -2.82995301e-01,  8.19476990e-01,\n",
       "        -1.83148754e-01, -1.29065207e-01, -2.24751481e-01, -8.57112946e-01,\n",
       "        -8.52952673e-01, -4.07803484e-01,  8.65239991e-01, -6.32458215e-01,\n",
       "        -2.87155573e-01,  7.02989352e-01, -5.45092487e-01,  1.45512797e-01,\n",
       "        -8.40471855e-01,  9.55895238e-02,  7.06278870e-02,  1.80546164e+00,\n",
       "        -3.74521302e-01,  1.64737128e+00,  5.54554689e+00,  1.01500981e+00,\n",
       "        -8.48792401e-01, -8.27991037e-01,  2.97449830e+00,  2.99442891e-01,\n",
       "         9.56765992e-01, -6.32458215e-01, -8.44632128e-01, -6.40778761e-01,\n",
       "         7.23790716e-01,  1.87115525e-01, -3.49559665e-01,  5.03296258e-01,\n",
       "        -4.57726758e-01,  1.88866710e+00, -5.83405697e-02,  1.73889728e+00,\n",
       "        -6.49099307e-01,  5.03296258e-01, -6.36618488e-01, -8.57112946e-01,\n",
       "         8.15316717e-01, -2.53873391e-01,  5.28257894e-01,  9.35964628e-01,\n",
       "        -5.28451395e-01, -8.52952673e-01, -4.41085667e-01, -8.36311582e-01,\n",
       "         7.48752353e-01, -6.78221216e-01, -7.69747218e-01,  2.70320981e-01,\n",
       "         8.98522173e-01,  1.00668927e+00, -3.53719938e-01,  3.49366164e-01,\n",
       "        -8.52952673e-01, -1.33225480e-01, -8.36311582e-01, -2.62193937e-01,\n",
       "        -8.36311582e-01, -4.57726758e-01,  5.40738713e-01,  3.02026130e+00,\n",
       "        -7.78067763e-01, -7.19823944e-01, -8.65433492e-01,  4.11770256e-01,\n",
       "         1.95436071e-01,  2.71240111e+00, -7.82228036e-01, -7.82228036e-01,\n",
       "        -8.48792401e-01, -8.44632128e-01, -8.48792401e-01,  1.65443406e-02,\n",
       "        -6.99022580e-01, -8.48792401e-01, -7.19823944e-01,  2.03756616e-01,\n",
       "        -1.29065207e-01, -7.19823944e-01, -7.48945854e-01, -9.57830248e-02]),\n",
       " 'time': array([[ 9,  1,  0],\n",
       "        [15,  1,  0],\n",
       "        [20,  1,  0],\n",
       "        [16,  1,  0],\n",
       "        [ 7,  1,  0],\n",
       "        [18,  1,  0],\n",
       "        [ 8,  1,  0],\n",
       "        [ 8,  1,  0],\n",
       "        [ 9,  1,  0],\n",
       "        [18,  1,  0],\n",
       "        [10,  1,  0],\n",
       "        [10,  1,  0],\n",
       "        [ 3,  1,  0],\n",
       "        [21,  1,  0],\n",
       "        [ 8,  1,  0],\n",
       "        [ 9,  1,  0],\n",
       "        [ 8,  1,  0],\n",
       "        [ 8,  1,  0],\n",
       "        [ 4,  1,  0],\n",
       "        [19,  1,  0],\n",
       "        [22,  1,  0],\n",
       "        [ 7,  1,  0],\n",
       "        [ 7,  1,  0],\n",
       "        [19,  1,  0],\n",
       "        [ 8,  1,  0],\n",
       "        [ 9,  1,  0],\n",
       "        [12,  1,  0],\n",
       "        [12,  1,  0],\n",
       "        [13,  1,  0],\n",
       "        [ 5,  1,  0],\n",
       "        [ 6,  1,  0],\n",
       "        [22,  1,  0],\n",
       "        [ 0,  1,  0],\n",
       "        [16,  1,  0],\n",
       "        [10,  1,  0],\n",
       "        [ 7,  1,  0],\n",
       "        [ 7,  1,  0],\n",
       "        [17,  1,  0],\n",
       "        [17,  1,  0],\n",
       "        [17,  1,  0],\n",
       "        [16,  1,  0],\n",
       "        [16,  1,  0],\n",
       "        [ 9,  1,  0],\n",
       "        [20,  1,  0],\n",
       "        [10,  1,  0],\n",
       "        [23,  1,  0],\n",
       "        [20,  1,  0],\n",
       "        [21,  1,  0],\n",
       "        [21,  1,  0],\n",
       "        [17,  1,  0],\n",
       "        [ 6,  1,  0],\n",
       "        [ 7,  1,  0],\n",
       "        [ 7,  1,  0],\n",
       "        [ 4,  1,  0],\n",
       "        [ 4,  1,  0],\n",
       "        [ 8,  1,  0],\n",
       "        [ 9,  1,  0],\n",
       "        [ 9,  1,  0],\n",
       "        [ 5,  1,  0],\n",
       "        [ 5,  1,  0],\n",
       "        [ 5,  1,  0],\n",
       "        [15,  1,  0],\n",
       "        [16,  1,  0],\n",
       "        [12,  1,  0],\n",
       "        [13,  1,  0],\n",
       "        [13,  1,  0],\n",
       "        [13,  1,  0],\n",
       "        [14,  1,  0],\n",
       "        [14,  1,  0],\n",
       "        [14,  1,  0],\n",
       "        [ 8,  1,  0],\n",
       "        [20,  1,  0],\n",
       "        [21,  1,  0],\n",
       "        [21,  1,  0],\n",
       "        [20,  1,  0],\n",
       "        [20,  1,  0],\n",
       "        [23,  1,  0],\n",
       "        [19,  1,  0],\n",
       "        [19,  1,  0],\n",
       "        [ 9,  1,  0],\n",
       "        [ 9,  1,  0],\n",
       "        [17,  1,  0],\n",
       "        [18,  1,  0],\n",
       "        [18,  1,  0],\n",
       "        [19,  1,  0],\n",
       "        [20,  1,  0],\n",
       "        [14,  1,  0],\n",
       "        [14,  1,  0],\n",
       "        [12,  1,  0],\n",
       "        [13,  1,  0],\n",
       "        [13,  1,  0],\n",
       "        [16,  1,  0],\n",
       "        [17,  1,  0],\n",
       "        [17,  1,  0],\n",
       "        [12,  1,  0],\n",
       "        [22,  1,  0],\n",
       "        [22,  1,  0],\n",
       "        [20,  1,  0],\n",
       "        [21,  1,  0],\n",
       "        [ 6,  1,  0],\n",
       "        [ 6,  1,  0],\n",
       "        [ 6,  1,  0],\n",
       "        [ 9,  1,  0],\n",
       "        [ 7,  1,  0],\n",
       "        [ 5,  1,  0],\n",
       "        [14,  1,  0],\n",
       "        [ 7,  1,  0],\n",
       "        [ 8,  1,  0],\n",
       "        [ 9,  1,  0],\n",
       "        [ 9,  1,  0],\n",
       "        [ 9,  1,  0],\n",
       "        [12,  1,  0],\n",
       "        [15,  1,  0],\n",
       "        [ 9,  1,  0],\n",
       "        [13,  1,  0],\n",
       "        [ 9,  1,  0],\n",
       "        [ 9,  1,  0],\n",
       "        [ 7,  1,  0],\n",
       "        [ 8,  1,  0],\n",
       "        [10,  1,  0],\n",
       "        [11,  1,  0],\n",
       "        [11,  1,  0],\n",
       "        [10,  1,  0],\n",
       "        [22,  1,  0],\n",
       "        [19,  1,  0],\n",
       "        [19,  1,  0],\n",
       "        [23,  1,  0],\n",
       "        [23,  1,  0],\n",
       "        [20,  1,  0],\n",
       "        [21,  1,  0],\n",
       "        [21,  1,  0],\n",
       "        [21,  1,  0],\n",
       "        [11,  1,  0],\n",
       "        [11,  1,  0],\n",
       "        [11,  1,  0],\n",
       "        [12,  1,  0],\n",
       "        [15,  1,  0],\n",
       "        [19,  1,  0],\n",
       "        [13,  1,  0],\n",
       "        [14,  1,  0],\n",
       "        [14,  1,  0],\n",
       "        [ 6,  1,  0],\n",
       "        [10,  1,  0],\n",
       "        [11,  1,  0],\n",
       "        [11,  1,  0],\n",
       "        [11,  1,  0],\n",
       "        [15,  1,  0],\n",
       "        [15,  1,  0],\n",
       "        [12,  1,  0],\n",
       "        [21,  1,  0],\n",
       "        [ 9,  1,  0],\n",
       "        [ 7,  1,  0],\n",
       "        [ 8,  1,  0],\n",
       "        [ 9,  1,  0],\n",
       "        [ 9,  1,  0],\n",
       "        [17,  1,  0],\n",
       "        [14,  1,  0],\n",
       "        [13,  1,  0],\n",
       "        [ 9,  1,  0],\n",
       "        [10,  1,  0],\n",
       "        [10,  1,  0],\n",
       "        [10,  1,  0],\n",
       "        [18,  1,  0],\n",
       "        [19,  1,  0],\n",
       "        [18,  1,  0],\n",
       "        [18,  1,  0],\n",
       "        [18,  1,  0],\n",
       "        [ 7,  1,  0],\n",
       "        [ 8,  1,  0],\n",
       "        [ 7,  1,  0],\n",
       "        [12,  1,  0],\n",
       "        [12,  1,  0]])}"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cancel_prob_all_data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'GID': array([   0,    0,    0, ..., 8518, 8518, 8518]),\n",
       " 'hour': array([ 0,  0,  0, ..., 23, 23, 23]),\n",
       " 'order': array([-0.09529744, -0.09529744, -0.09529744, ..., -0.09529744,\n",
       "        -0.09529744, -0.09529744]),\n",
       " 'reward': array([-0.27888531, -0.27888531, -0.27888531, ..., -0.27888531,\n",
       "        -0.27888531, -0.27888531]),\n",
       " 'weekday': array([0, 1, 2, ..., 4, 5, 6])}"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "grid_order_reward_all_data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [],
   "source": [
    "rr = pickle.load(open(pkl_folder + 'ride_req.pkl', 'rb'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {},
   "outputs": [],
   "source": [
    "res = []\n",
    "rrlen = len(rr['ID'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dict_keys(['pos', 'grid', 'ID', 'time', 'reward', 'end_grid', 'start_grid'])"
      ]
     },
     "execution_count": 93,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rr.keys()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "metadata": {},
   "outputs": [],
   "source": [
    "from common import real_distance, min_gps, max_gps"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "res = []\n",
    "for i in range(len(rr['ID'])):\n",
    "    dis = ((np.abs(rr['pos'][i][0] - rr['pos'][i][1]) / (max_gps - min_gps) * real_distance) ** 2).sum() ** 0.5\n",
    "    time = rr['time'][i][1] - rr['time'][i][0]\n",
    "    res.append([dis, time])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "metadata": {},
   "outputs": [],
   "source": [
    "rrr = [x[0] / x[1] for x in res if x[1] > 0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5.705190955808098"
      ]
     },
     "execution_count": 124,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.mean(rrr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [],
   "source": [
    "gr = pickle.load(open(pkl_folder + 'grid_order_reward.pkl', 'rb'))\n",
    "gr = gr['order']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "6052"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(gr.sum(axis=1).sum(axis=1)==0).sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
